2012-11-21 53 views
1

我有一個web應用程序和一個處理Redis消息的後臺服務。但是,我不確定網絡應用程序的RedisMqServer應該配置爲單例(我使用Ninject作爲IoC容器)。每個請求將需要發送消息到後臺服務(單向),但我不確定它應該實例化每個請求或每個應用程序。應該爲每個應用程序配置一次RedisMqServer/RedisMqHost?

我在想,容器會這樣配置:

var clientManager = new PooledRedisClientManager(); 
var mqHost = new RedisMqHost(clientManager); 

Bind<IMessageProducer>() 
    .ToMethod(_ => mqHost.MessageFactory.CreateMessageProducer()) 
    .InRequestScope(); 

或者,也許RedisMqHost/RedisMqServer是沒有必要的,當消息是單向的?因此,降低配置:

var clientManager = new PooledRedisClientManager(); 

Bind<IMessageProducer>() 
    .ToMethod(_ => new RedisMessageProducer(clientManager)) 
    .InRequestScope(); 

回答

1

你實際上並不需要註冊IMessageService如果你的服務不直接需要對主機的訪問。但是如果你最終使用它,那麼是的,它應該被註冊爲單例。

唯一需要註冊的是IMessageFactory。在這種情況下,RequestScope與Ninject的默認TransientScope相同,因爲如果它正在被使用,它將只在您的Service類中的每個請求中被解析一次。

IMessageFactory在基礎Service用於懶洋洋地加載IMessageProducer,所以你可以在你的服務發佈消息:

base.MessageProducer.Publish(new RequestDto()); 

注意:您正在使用的代碼RedisMqHost其中處理所有消息上一個單個後臺線程。更改爲使用RedisMqServer將爲每種消息類型創建一個後臺線程,允許並行處理不同的消息。

+0

太棒了 - 你是我希望回答這個問題的確切人物。謝謝! – TheCloudlessSky

+0

也許你在我編輯完問題後回答了,但是你認爲手工創建'RedisMessageProducer'比使用工廠更好嗎?或者沒有關係,因爲這正是MessageFactory所做的(我看了解源代碼)? – TheCloudlessSky

+0

如果可能的話,你應該總是儘量避免綁定到代碼中的具體類型構造函數(所以如果可用的話總是使用工廠)。這也突出了一個錯誤,你應該註冊'IMessageFactory'而不是'IMessageProducer' - 我已經更新了我的回答以反映。 – mythz

相關問題