我正在完成第一步,找出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”,如果可能的话,我不想错过使用它。)
这个问题有更好的解决方案吗?
由于
答案 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访问它,我建议找一个更好的方法来做它。