2

我想(可能通过应用程序/网络配置)在运行时更改我的 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 对象的能力,我只需要一种从我注册的缓存中获取特定缓存的方法,我看不到它的任何属性。

4

2 回答 2

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());
}

希望有帮助!

于 2013-09-05T02:24:35.510 回答
0

在我看来,您需要更多的灵活性,而不仅仅是在复合根上进行简单的注册,您可以尝试在容器注册中实现复合模式

steven使用简单的注入器解释了这种模式,但我认为它可以通过 SS 或任何其他提供的 OOB 提供的 IOC 来实现

我希望这会有所帮助

于 2013-09-13T17:22:44.303 回答