C# 是否应为每个应用程序配置一次RedisMqServer/RedisMqHost?
我有一个web应用程序和一个后台服务,可以处理来自Redis的消息。但是,我不确定web应用程序的C# 是否应为每个应用程序配置一次RedisMqServer/RedisMqHost?,c#,.net,ninject,servicestack,C#,.net,Ninject,servicestack,我有一个web应用程序和一个后台服务,可以处理来自Redis的消息。但是,我不确定web应用程序的RedisMqServer是否应配置为单例(我使用Ninject作为IoC容器)。出现的每个请求都需要向后台服务发送消息(单向),但我不确定它是否应该按照每个请求或每个应用程序进行实例化 我认为容器的配置如下: var clientManager = new PooledRedisClientManager(); var mqHost = new RedisMqHost(clientManager)
RedisMqServer
是否应配置为单例(我使用Ninject作为IoC容器)。出现的每个请求都需要向后台服务发送消息(单向),但我不确定它是否应该按照每个请求或每个应用程序进行实例化
我认为容器的配置如下:
var clientManager = new PooledRedisClientManager();
var mqHost = new RedisMqHost(clientManager);
Bind<IMessageProducer>()
.ToMethod(_ => mqHost.MessageFactory.CreateMessageProducer())
.InRequestScope();
如果您的服务不需要直接访问主机,则实际上不需要注册
IMessageService
。但是如果你最终使用了它,那么是的,它应该被注册为单例
唯一需要注册的是IMessageFactory
。在这种情况下,RequestScope与Ninject的默认值TransientScope相同,因为如果使用它,在您的服务类中,每个请求只能解析一次
基本中使用IMessageFactory
延迟加载IMessageProducer
,以便您可以在服务中发布消息:
base.MessageProducer.Publish(new RequestDto());
注意:您在代码中使用的是
RedisMqHost
,该代码处理单个后台线程上的所有消息。更改为使用RedisMqServer将为每种消息类型创建一个后台线程,允许并行处理不同的消息。如果您的服务不需要直接访问主机,您实际上不需要注册IMessageService
。但是如果你最终使用了它,那么是的,它应该被注册为单例
唯一需要注册的是IMessageFactory
。在这种情况下,RequestScope与Ninject的默认值TransientScope相同,因为如果使用它,在您的服务类中,每个请求只能解析一次
基本中使用IMessageFactory
延迟加载IMessageProducer
,以便您可以在服务中发布消息:
base.MessageProducer.Publish(new RequestDto());
注意:您在代码中使用的是
RedisMqHost
,该代码处理单个后台线程上的所有消息。更改为使用RedisMqServer将为每种消息类型创建一个后台线程,允许并行处理不同的消息。太棒了-你正是我希望回答这个问题的人。谢谢也许你是在我编辑问题后回答的,但是你认为手动创建RedisMessageProducer
比使用工厂好吗?或者这并不重要,因为这正是MessageFactory所做的(我查看了源代码)?如果可能的话,您应该尽量避免绑定到代码中的具体类型构造函数(因此,如果有工厂,请始终使用它)。这也突出了一个错误,你应该注册IMessageFactory
而不是IMessageProducer
-我已经更新了我的答案以反映。抱歉-我忘了提到我没有在web应用程序中使用ServiceStack,它是一个MVC3应用程序(因此Service
不适用于我的情况)。那么,这有意义吗?或者您仍然会实例化RedisMqServer/RedisMqHost
并像您在示例中那样调用工厂吗?是的,请求范围IMessageProducer
也可以工作,尽管我自己更喜欢使用定义良好的工厂。太棒了-您正是我希望回答这个问题的人。谢谢也许你是在我编辑问题后回答的,但是你认为手动创建RedisMessageProducer
比使用工厂好吗?或者这并不重要,因为这正是MessageFactory所做的(我查看了源代码)?如果可能的话,您应该尽量避免绑定到代码中的具体类型构造函数(因此,如果有工厂,请始终使用它)。这也突出了一个错误,你应该注册IMessageFactory
而不是IMessageProducer
-我已经更新了我的答案以反映。抱歉-我忘了提到我没有在web应用程序中使用ServiceStack,它是一个MVC3应用程序(因此Service
不适用于我的情况)。那么,这有意义吗?或者您仍然会实例化RedisMqServer/RedisMqHost
并像您在示例中那样调用工厂吗?是的,请求范围IMessageProducer
也可以工作,但我更喜欢使用定义良好的工厂。