如何在ServiceStack中运行时更改CacheClients?

时间:2013-09-04 15:47:44

标签: servicestack

我希望(通过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对象,我只需要一种从我的注册缓存中获取特定缓存的方法,我看不到任何属性。

2 个答案:

答案 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

我希望有帮助