我参加了Udi Dahan在挪威ndc 2009的演讲 - 制作模式完成。
现在我想用Nservicebus中的MessageHandlers替换我的所有存储库。
我正在使用Nhibernate,但我不知道在哪里放置BeginTranscactin / commit和OpenSession。
每个消息处理程序是否应包含begintransaction和openSession?
那些以同步方式运行的消息管道怎么样?
我想这是不可能在消息之外打开会话并将其作为消息的属性传递 - 因为调用者和服务器在两个不同的进程中运行。
消息处理程序示例:
IGetOrderHeaders,返回没有订单行的订单
IGetOrderWithOrderlines,返回订单行的订单
ITakeOrderByTruck,当前的卡车从池中获取订单
IUnloadPalletFromCarByTruck,从汽车卸载货盘
IPutPalletAtLocationByTruck,将托盘放在位置
IMakeOrderDoneByTruck,将订单状态设置为当前卡车
我还考虑过使用Prism服务器而不是nservicebus - 这实际上非常好用,尽管它不打算在服务器端使用它。但理想的解决方案是nservicebus。
答案 0 :(得分:2)
您可以通过实现messagemodule(IMessageModule)来完成此操作。看一下NHibernate saga persister使用的NHibernateMessageModule:
躯干\ SRC \ IMPL \ SagaPersisters \ NHibernateSagaPersister \ NServiceBus.SagaPersisters.NHibernate
您可以在sessionfactory中缓存会话(如上面的示例),也可以使用“ThreadStatic”缓存模式将其存储在您喜欢的容器中。
NServiceBus在TransactionScope中运行所有处理程序,以便自动为您处理事务!
希望这有帮助!