在此之前,抱歉,如果我误解了问题或限制,我想会尝试解释它们并指出它应该是什么样子。
- 生产总是使用 Redis
- 您可以在不同的端口上设置应用实例,使其与“暂存”(或其他)应用实例完全分离
如果您能满足第二个条件,您可以使用自定义模块并为您的服务应用不同的客户端包装器(策略):
Cache module 的自定义提供程序
import * as redis from 'redis'
import { INTERNAL_CACHE_CLIENT, INTERNAL_CACHE_MODULE } from './cache.constants'
import { CacheModuleAsyncOptions, InternalCacheOptions } from './cache.module'
import CacheClientRedis from './client/cache-client-redis'
// ...
export const createAsyncClientOptions = (options: CacheModuleAsyncOptions) => ({
provide: INTERNAL_CACHE_MODULE,
useFactory: options.useFactory,
inject: options.inject,
})
export const createClient = () => ({
provide: INTERNAL_CACHE_CLIENT,
useFactory: (options: InternalCacheOptions) => {
const { production, debug, noCache, ...redisConfig } = options
// pardon for the ifs ; )
if (noCache) {
return new CacheClientInMemory()
}
if (production) {
return new CacheClientRedis(redis.createClient(redisConfig))
}
if (debug) {
return new MockedCache()
}
return new CacheClientMemory()
},
inject: [INTERNAL_CACHE_MODULE],
})
如前所述,您可以在 CacheClient 周围使用任何包装器,在您的情况下,它将从文件中提供数据。为简单起见,任何缓存客户端实现的接口示例如下:
export interface CacheClient {
set: (key: string, payload: string) => Promise<boolean>
get: (key: string) => Promise<string | null>
del: (key: string) => Promise<boolean>
}
现在,由于我们已经让模块决定应该使用哪种策略,服务只需要:
constructor(
@Inject(INTERNAL_CACHE_CLIENT) private readonly cacheClient: CacheClient) {
}
如果它仍然违反原则,或者您真的需要在运行时决定它,请随时指出。
干杯!