将ServiceStack ICacheClient与Redis和Ninject一起使用

时间:2013-02-28 14:35:58

标签: c# asp.net redis ninject servicestack

我使用来自servicestack库的ICacheClient,Redis作为后端。

我也在使用Ninject进行DI。

我试图找出绑定PooledRedisClient经理的范围。

我尝试了以下内容:

Bind<ICacheClient>().ToMethod(ctx => new PooledRedisClientManager(redisURI)).InSingletonScope();

这似乎工作正常,但我经常看到RedisResponseExceptions

我认为这是由于我的连接耗尽。

也许SingletonScope不正确?

有人能指出我正确的方向吗?我使用的是servicestack版本:3.9.0

修改

这是正确的用法吗?

Bind<ICacheClient>().ToMethod(ctx => new PooledRedisClientManager(redisURI).GetCacheClient()).InSingletonScope();

1 个答案:

答案 0 :(得分:2)

Bind<ICacheClient>().ToMethod(ctx => new PooledRedisClientManager(redisURI).GetCacheClient()).InSingletonScope();

不熟悉Ninject语法,但似乎以上可能是每次ICacheClient解析时都会创建一个新的PooledRedisClientManager实例?不确定“InSingletonScope”在链中的应用位置。

也许SingletonScope不正确?

<强>更新 Singleton是正确且必要的,以获得池化CacheClients的好处。拥有包含CacheClients集合(池)的PooledRedisClientManager的单个实例将检索现有的CacheClient而不是打开新的CacheClient。您可以通过在构造函数中传入poolSize参数来限制池大小(默认值为10?)。

您也可以使用不会连接连接的BasicRedisClientManager,并始终打开并配置CacheClient。

SingletonScope不正确。我的理解是,如果你使你的PooledRedisClientManager成为一个单例,它将永远不会处理和关闭它创建的RedisClients。 Singleton的想法是创建一个总是被使用的单个实例(在这种情况下是PooledRedisClientManager)被处置。由PooledRedisClientManager创建的每个RedisClient(通过调用GetClient())将推迟PooledRedisClientManger处理它。 PooledRedisClientManager的实例不想丢弃他们的RedisClients,只需将它们作为非活动状态放回“池”中。