使用ServiceStack ICacheClient与Redis和Ninject

本文关键字:Ninject Redis ServiceStack ICacheClient 使用 | 更新日期: 2023-09-27 18:01:30

我是使用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();

使用ServiceStack ICacheClient与Redis和Ninject

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

不熟悉Ninject语法,但似乎上面可以创建PooledRedisClientManager的新实例每次ICacheClient被解决?不确定'InSingletonScope'在链中的位置。

也许SingletonScope不正确?

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

你也可以使用BasicRedisClientManager,它不会池化连接,总是打开和释放CacheClient。

SingletonScope不正确。我的理解是,如果你使你的PooledRedisClientManager一个单例,它将永远不会处置和关闭它创建的RedisClients。 Singleton的思想是创建一个单独的实例(在本例中为PooledRedisClientManager),它将始终被使用而不被处置。每个由你的PooledRedisClientManager创建的RedisClient(通过调用GetClient())将延迟PooledRedisClientManager来处理它。PooledRedisClientManager的实例不想处理它们的redisclient,只是将它们作为非活动状态放回"池"中。