1

我有一个 Web 应用程序和一个处理来自 Redis 的消息的后台服务。但是,我不确定是否RedisMqServer应该将 Web 应用程序配置为单例(我使用 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();
4

1 回答 1

1

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

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

IMessageFactory用于在基础服务延迟加载,IMessageProducer以便您可以在服务中发布消息:

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

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

于 2012-11-21T18:11:04.573 回答