Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否应为每个应用程序配置一次RedisMqServer/RedisMqHost?_C#_.net_Ninject_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,.net,Ninject,servicestack" /> servicestack,C#,.net,Ninject,servicestack" />

C# 是否应为每个应用程序配置一次RedisMqServer/RedisMqHost?

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)

我有一个web应用程序和一个后台服务,可以处理来自Redis的消息。但是,我不确定web应用程序的
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
也可以工作,但我更喜欢使用定义良好的工厂。