Конфигурирование Rebus Sagas с UnitOfWork
В настоящее время я обновляю свой 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>()));
});
Если невозможно использовать один и тот же UnitOfWork как для Events, так и для Sagas, и мне просто нужно, чтобы он работал, как в 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 ответ
Ваша конфигурация выглядит правильно, за исключением одного: если у вас есть единица работы, я предполагаю, что вы также используете NHibernate для создания транзакции?
Если это так, вы должны обязательно использовать ConnectionHolder.ForTransactionalWork(...)
фабрика, чтобы получить держатель соединения, а затем вы можете использовать этот неприятный маленький трюк, чтобы получить SqlTransaction
это обернуто NHibernate.