我希望(通过app / web配置)在运行时更改我的ServiceStack应用程序中使用的缓存客户端。
例如,我目前有这个:
container.Register<ICacheClient>(new MemoryCacheClient());
我希望在运行时将其更改为Redis ICacheClient用法。如果我注册了两个容器(一个内存和Redis),该怎么办?是否可以在我的服务中这样的调用中在运行时切换容器:
public object Get(FooRequest request)
{
string cacheKey = UrnId.CreateWithParts("Foo", "Bar");
return RequestContext.ToOptimizedResultUsingCache(base.Cache, cacheKey, sCacheDuration, () =>
{
return TestRepository.Foos;
});
}
编辑:
注意,经过更多研究,如果您注册了多个ICacheClient:
container.Register<IRedisClientsManager>(c => new PooledRedisClientManager("localhost:6379"));
container.Register(c => c.Resolve<IRedisClientsManager>().GetCacheClient());
container.Register<ICacheClient>(new MemoryCacheClient());
然后访问服务中的base.Cache将返回已注册的最新ICacheClient ...即:在上面的例子中,MemoryCacheClient。
因此,能够从服务中访问Cache对象,我只需要一种从我的注册缓存中获取特定缓存的方法,我看不到任何属性。
答案 0 :(得分:1)
执行此类操作将允许您根据Web配置设置向容器注册不同的提供程序:
var redisCacheString = ConfigurationManager.AppSettings["UseRedis"];
var useRedis = false;
if (!bool.TryParse(redisCacheString, out useRedis))
{
container.Register<IRedisClientsManager>(c => new PooledRedisClientManager("localhost:6379"));
container.Register(c => c.Resolve<IRedisClientsManager>().GetCacheClient());
}
else
{
container.Register<ICacheClient>(new MemoryCacheClient());
}
希望有所帮助!
答案 1 :(得分:0)
在我看来,您需要更多的灵活性,而不仅仅是在复合根上进行简单注册,您可以尝试在容器注册中实现composite pattern。
steven explains this pattern using simple injector但我认为可以通过SS或其他任何其他方式提供OOB提供的OOB
我希望有帮助