Nservicebus Singleton模式 - 挂钩到当前存在的对象

时间:2010-12-06 10:10:17

标签: singleton nservicebus

我正在完成第一步,找出Nservicebus并规划一个相当大的规模(至少对我而言)app。

我希望该应用能够扩展到X机器上。它将提供许多服务,例如:

LogonService UserManagementService GameService 客房服务 等...

客户端将通过WCF与服务器通信。服务本身将通过NServiceBus和MSMQ相互通信。 Sacha Barber has written an excellent article开始使用NServiceBus并且遇到了我要遇到的同样情况。 Udi和Sacha之间还有关于here的进一步聊天。

我的问题是,当服务正在处理消息时,它如何知道该服务中应用程序的其余部分?正如Sacha所说,当消息需要处理时,“处理程序将自动”出现。因此,当创建它时,它如何知道已经启动并运行的其他对象。例如,在GameService中,它将包含当前正在运行的所有游戏的列表。它将如何访问它?

我想我能想到的两个选项(如Sacha指出的那样)是:

介体模式 单

在这两个中,我想我宁愿在Castle Windsor注册一个单身人士并以这种方式使用它。

这是否适合使用Singleton模式,(因为你经常看到人们将Singleton称为“Devil”,如果可能的话,我不想错过使用它。)

这个问题有更好的解决方案吗?

由于

2 个答案:

答案 0 :(得分:2)

对于需要保存在内存中的状态,我也会使用Singleton模式。否则状态通常在数据存储区中维护,并由处理程序读取每个消息的进行。

public Handle(SomeMessage msg)
{
   var aggregateRoot = writeStore.Get(msg.SomeId);

   aggregate.DoSomeAction(msg.SomeOtherData);

   //if write store does not support dirty tracking
   writeStore.Save(aggregateRoot);
}

答案 1 :(得分:0)

如果您想在其他方面进行单元测试,单身人士非常糟糕。在初始化消息处理程序时,NServiceBus使用Spring(默认情况下)作为依赖注入框架。理想情况下,您自己插入Spring并注册您的对象,以便可以通过它们注入。弹簧。

话虽如此,单身人士是实现目标的简单方法。但是,如果你要创建一个单独的对象的唯一原因是NServiceBus访问它,我建议找一个更好的方法来做它。