使用UnitOfWork配置Rebus sagas

时间:2015-12-08 15:42:33

标签: rebus

我正在将我的Rebus 0.45更新为0.70.3,并且遇到了一些关于我的传奇配置的问题/想法。以前我做过以下事情:

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,我开始想知道是否可以在我的传奇中使用我用于处理程序的相同UnitOfWorkManager? 我的处理程序配置如下:

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

如果无法对事件和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()));

1 个答案:

答案 0 :(得分:1)

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

如果是这种情况,您应该确保使用ConnectionHolder.ForTransactionalWork(...)工厂来获取连接持有者,然后您可以使用this nasty little trick来检索被SqlTransaction包裹的IsAuthorizedPerClass() NHibernate的。