我有一个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();
答案 0 :(得分:1)
如果您的服务不需要直接访问主机,则实际上不需要注册IMessageService
。但是如果你最终使用它,那么它应该注册为单身。
唯一需要注册的是IMessageFactory
。在这种情况下, RequestScope 与Ninject的默认 TransientScope 相同,因为如果正在使用它,则每个请求只会在您的Service类中解析一次。
基础Service中使用IMessageFactory
来懒惰加载IMessageProducer
,以便您可以在服务中发布消息:
base.MessageProducer.Publish(new RequestDto());
注意:您在代码中使用RedisMqHost
来处理单个后台线程上的所有消息。更改为使用RedisMqServer
将为每种消息类型创建后台线程,允许并行处理不同的消息。