Я сейчас обновляю свой Rebus 0.45 до 0.70.3 и сталкивался с некоторыми проблемами/мыслями относительно конфигураций моих саг. Ранее я сделал следующее:Настройка саблей Rebus с UnitOfWork
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 для обоих событий и Саги, и мне просто нужно, чтобы работать, как и в 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, поэтому я мог использовать этот трюк, чтобы получить транзакцию. Должна ли Сага и Обработчик использовать один и тот же сеанс или это приведет к некоторому странному поведению, если один из них потерпит неудачу? В противном случае я просто использую UnitOfWorkManager, чтобы создать новый сеанс для Саги, а затем получить транзакцию с трюком, я полагаю? – Thestrup
Если они используют то же самое, они будут выполнять свою работу в одной транзакции базы данных. Я не вижу причин, почему это не должно просто работать :) – mookid8000