使用 UnitOfWork 配置 Rebus sagas

Configuring Rebus sagas with UnitOfWork

我目前正在将我的 Rebus 0.45 更新到 0.70.3,并且遇到了一些 problems/thoughts 关于我的 sagas 配置的问题。以前我做过以下事情:

var rebusConfigurer = Configure.With(new WindsorContainerAdapter(container))
                               .Logging(l => l.Log4Net()).Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
                               .MessageOwnership(o => o.FromRebusConfigurationSection())
                               .Sagas(s => s.StoreInSqlServer(() => (SqlConnection)container.Resolve<INHibernateSessionFactory>().CreateSession().Connection, "sagas", "saga_index"))
                               .SpecifyOrderOfHandlers(s => s.Use(new MyMessageHandlerInspector()));

既然我必须使用 ConnectionHolder,我开始想知道是否可以使用与我在 sagas 中的处理程序相同的 UnitOfWorkManager? 我的处理程序配置如下:

rebusConfigurer.Events(e =>
            {
                e.MessageSent += AutomaticallySetTimeToBeReceived;
                e.UncorrelatedMessage += EOnUncorrelatedMessage;
                e.PoisonMessage += EOnPoisonMessage;
                e.AddUnitOfWorkManager(new RebusNHibernateUnitOfWorkManager(container.Resolve<ISessionFactory>()));
            });

如果不能对 Events 和 Sagas 使用相同的 UnitOfWork,而我只需要它像 0.45 中那样工作,我想我应该按照这些思路做一些事情:

var rebusConfigurer = Configure.With(new WindsorContainerAdapter(container))
                               .Logging(l => l.Log4Net()).Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
                               .MessageOwnership(o => o.FromRebusConfigurationSection())
                               .Sagas(s => s.StoreInSqlServer(() => ConnectionHolder.ForNonTransactionalWork((SqlConnection)container.Resolve<INHibernateSessionFactory>().CreateSession().Connection), "sagas", "saga_index"))
                               .SpecifyOrderOfHandlers(s => s.Use(new MyMessageHandlerInspector()));

你的配置看起来是正确的,除了一件事:如果你有一个工作单元,我猜你也使用 NHibernate 来创建一个事务?

如果是这样,你应该确保使用ConnectionHolder.ForTransactionalWork(...)工厂来获取连接持有者,然后你可以使用this nasty little trick来检索SqlTransaction由 NHibernate 包装。