1

我正在使用ICacheClient来自 servicestack 库的 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();
4

1 回答 1

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

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

也许 SingletonScope 不正确?

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

您还可以使用 BasicRedisClientManager,它不会汇集连接并始终打开和处置 CacheClient。

SingletonScope 不正确。我的理解是,如果您将 PooledRedisClientManager 设为 Singleton,它将永远不会处理和关闭它创建的 RedisClients。Singleton 的想法是创建一个实例(在本例中为 PooledRedisClientManager),该实例将始终被使用而不被释放。每个由 PooledRedisClientManager 创建的 RedisClient(通过调用 GetClient())都会推迟 PooledRedisClientManger 处理它。PooledRedisClientManager 的实例不想处理它们的 RedisClients,只是将它们作为非活动状态放回“池”中。

于 2013-02-28T16:00:14.697 回答