2013-02-28 39 views
1

我在使用Redis的servicestack庫中的ICacheClient作爲後端。在Redis和Ninject中使用ServiceStack ICacheClient

我也在使用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

也許@mythz可以在這裏響個不停?我已經看到了類似的問題,但無法找到一個明確的答案 – stephen776 2013-02-28 14:38:39

+0

我剛剛從我的Redis的供應商說,我是跑出來的客戶端連接的電子郵件通知,所以我覺得這是DEF我的問題哈哈 – stephen776 2013-02-28 14:59:55

+0

你不應該用完連接時的註冊爲一個單[自redis的所有訪問被包裹在一個使用塊(https://github.com/ServiceStack/ServiceStack.Redis/blob/master/tests/ServiceStack.Redis.Tests/ServiceStack.Redis/PooledRedisClientManager.ICacheClient的.cs)。您可能會遇到與此無關的其他問題。 – mythz 2013-02-28 19:11:23

回答

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

不熟悉Ninject語法,但它似乎像PooledRedisClientManager每次ICacheClient上面可以創建一個新的實例解決?不確定'InSingletonScope'在鏈中應用的位置。

也許SingletonScope不正確?

UPDATE 辛格爾頓是正確和必要的,以獲得彙集CacheClients的好處。擁有包含CacheClients集合(池)的PooledRedisClientManager的單個實例將檢索現有的CacheClients,而不是打開新的CacheClients。您可以通過在構造函數中傳入poolSize參數來限制池大小(默認值爲10?)。

你也可以使用,不會池中的連接始終開放和處置CacheClient的BasicRedisClientManager。

SingletonScope不正確。我的理解是,如果您將PooledRedisClientManager設置爲Singleton,它將永遠不會處理並關閉它創建的RedisClient。 單例的想法是創建一個總是被使用並且不被處理的實例(在這種情況下是PooledRedisClientManager)。您的PooledRedisClientManager(通過調用GetClient())創建的每個RedisClient都將推遲PooledRedisClientManger來處理它。 PooledRedisClientManager的實例不想丟棄他們的RedisClient,只需將它們放回'池'中作爲非活動狀態。

+0

感謝您的解釋。希望@mythz可以肯定地證實。 – stephen776 2013-02-28 16:01:51

+0

實際上你已經明白了:http://stackoverflow.com/a/14861035/85785 - RedisClientsManager應該在Singleton範圍內。它發生了'PooledRedisClientsManager'也實現了'ICacheClient',它應該被註冊爲單例,因爲[每個操作都被封裝在一個使用塊中](https://github.com/ServiceStack/ServiceStack.Redis/blob/master/tests /ServiceStack.Redis.Tests/ServiceStack.Redis/PooledRedisClientManager.ICacheClient.cs) – mythz 2013-02-28 19:10:10

+0

更新並希望更正我答案中的信息。 – paaschpa 2013-02-28 20:46:46

相關問題