1

ICacheClientバックエンドとしてRedisを使用してservicestackライブラリからを使用しています。

DIにはNinjectも使用しています。

PooledRedisClientマネージャーをバインドするスコープを見つけようとしています。

私は次のことを試しました:

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

これはうまくいくようですが、私は常にRedisResponseExceptions.

これは、接続が不足しているためだと思います。

おそらくSingletonScopeが間違っていますか?

誰かが私を正しい方向に向けることができますか? サービススタックのバージョンを使用しています: 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?)。

接続をプールせず、常に CacheClient を開いて破棄する BasicRedisClientManager を使用することもできます。

SingletonScope が正しくありません。私の理解では、PooledRedisClientManager をシングルトンにすると、作成した RedisClients を破棄したり閉じたりすることはありません。シングルトンの考え方は、常に使用され、破棄されない単一のインスタンス (この場合は PooledRedisClientManager) を作成することです。PooledRedisClientManager によって (GetClient() を呼び出して) 作成されたすべての RedisClient は、PooledRedisClientManger の破棄を延期します。PooledRedisClientManager のインスタンスは、RedisClient を破棄したくありません。非アクティブとして「プール」に戻すだけです。

于 2013-02-28T16:00:14.697 に答える