Конфигурирование 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.

Другие вопросы по тегам