2012-11-21 56 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

相关问题