我使用来自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();
答案 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,只需将它们作为非活动状态放回“池”中。