我正在将我的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()));
答案 0 :(得分:1)
您的配置看起来是正确的,除了一件事:如果您有一个工作单元,我猜你也使用NHibernate来创建一个事务?
如果是这种情况,您应该确保使用ConnectionHolder.ForTransactionalWork(...)
工厂来获取连接持有者,然后您可以使用this nasty little trick来检索被SqlTransaction
包裹的IsAuthorizedPerClass()
NHibernate的。