使用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();
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,只是将它们作为非活动状态放回"池"中。