每个应用程序应该配置一次RedisMqServer / RedisMqHost吗?

时间:2012-11-21 17:13:20

标签: c# .net ninject servicestack

我有一个Web应用程序和后台服务来处理来自Redis的消息。但是,我不确定Web应用程序的RedisMqServer是否应该配置为单例(我使用Ninject作为我的IoC容器)。每个请求都需要将消息发送到后台服务(单向),但我不确定它是应该按请求还是按应用程序实例化。

我原以为容器的配置如下:

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 个答案:

答案 0 :(得分:1)

如果您的服务不需要直接访问主机,则实际上不需要注册IMessageService。但是如果你最终使用它,那么它应该注册为单身。

唯一需要注册的是IMessageFactory。在这种情况下, RequestScope 与Ninject的默认 TransientScope 相同,因为如果正在使用它,则每个请求只会在您的Service类中解析一次。

基础Service中使用IMessageFactory来懒惰加载IMessageProducer,以便您可以在服务中发布消息:

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

注意:您在代码中使用RedisMqHost来处理单个后台线程上的所有消息。更改为使用RedisMqServer将为每种消息类型创建后台线程,允许并行处理不同的消息。