在nservicebus中放置begintransaction和opensession的位置

在nservicebus中放置begintransaction和opensession的位置,nservicebus,Nservicebus,我参加了Udi Dahan在挪威国家数据中心2009年的演讲——制作完整的模式。 现在我想用Nservicebus中的MessageHandler替换我的所有存储库。 我正在使用Nhibernate,但我不知道将BeginTransactin/commit和OpenSession放在哪里。 每个messagehandler是否应该包含begintransaction和openSession 以同步方式运行的消息管道如何 我猜不可能在消息之外打开会话并将其作为消息的属性传递,因为调用方和服务器运行

我参加了Udi Dahan在挪威国家数据中心2009年的演讲——制作完整的模式。 现在我想用Nservicebus中的MessageHandler替换我的所有存储库。 我正在使用Nhibernate,但我不知道将BeginTransactin/commit和OpenSession放在哪里。 每个messagehandler是否应该包含begintransaction和openSession
以同步方式运行的消息管道如何
我猜不可能在消息之外打开会话并将其作为消息的属性传递,因为调用方和服务器运行在两个不同的进程中

MessageHandler的示例:

IGetOrderHeaders,返回没有订单行的订单
IGetOrderWithOrderlines,返回带有订单行的订单
ITakeOrderByTruck,当前卡车从池中获取订单
IUnloadPalletFromCarByTruck,从汽车上卸下托盘
i托盘位置通过卡车,将托盘放置在位置
IMakeOrderDoneByTruck,将订单状态设置为“按当前卡车完成”


我还考虑过使用Prism服务器端而不是nservicebus——这实际上相当好,尽管它并不打算在服务器端使用它。但是理想的解决方案是nservicebus。

您可以通过实现messagemodule(IMessageModule)来实现这一点。查看NHibernate saga持久化器使用的NHibernate消息模块:

trunk\src\impl\SagaPersisters\NHibernateSagaPersister\NServiceBus.SagaPersisters.NHibernate

您可以将会话缓存在sessionfactory中(如上面的示例),也可以使用其“ThreadStatic”缓存模式将其存储在您喜爱的容器中

NServiceBus运行TransactionScope中的所有处理程序,以便自动为您处理事务


希望这有帮助

ThreadStatic将为一个线程使用一个会话,因此它将使用一个非常长的有效会话,并且在整个应用程序期间都将在内存中。这会在未手动清除会话时导致内存问题,并使其无法使用。还是我错了?如果将NHibernate与系统集成。事务将在会话提交/中止时关闭并处置会话,以便释放会话持有的任何资源。它确实提交,但不处置。