在nservicebus中放置begintransaction和opensession的位置

时间:2010-01-08 11:39:35

标签: nservicebus

我参加了Udi Dahan在挪威ndc 2009的演讲 - 制作模式完成。 现在我想用Nservicebus中的MessageHandlers替换我的所有存储库。 我正在使用Nhibernate,但我不知道在哪里放置BeginTranscactin / commit和OpenSession。 每个消息处理程序是否应包含begintransaction和openSession?
那些以同步方式运行的消息管道怎么样?
我想这是不可能在消息之外打开会话并将其作为消息的属性传递 - 因为调用者和服务器在两个不同的进程中运行。

消息处理程序示例:

IGetOrderHeaders,返回没有订单行的订单
IGetOrderWithOrderlines,返回订单行的订单
ITakeOrderByTruck,当前的卡车从池中获取订单 IUnloadPalletFromCarByTruck,从汽车卸载货盘
IPutPalletAtLocationByTruck,将托盘放在位置
IMakeOrderDoneByTruck,将订单状态设置为当前卡车

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

1 个答案:

答案 0 :(得分:2)

您可以通过实现messagemodule(IMessageModule)来完成此操作。看一下NHibernate saga persister使用的NHibernateMessageModule:

躯干\ SRC \ IMPL \ SagaPersisters \ NHibernateSagaPersister \ NServiceBus.SagaPersisters.NHibernate

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

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

希望这有帮助!