Управление сессией RavenDb в Виндзоре под NServiceBus
Я использую NServiceBus (3.2.2), RavenDB (1.2.2017-Unstable) и Windsor (3.0.0.4001) в проекте MVC 4.
У меня есть класс IHandleMessages, который обрабатывает 3 разных сообщения, и для этого требуется IDocumentSession, и, следовательно, определяет свойство, такое как:
public IDocumentSession DocumentSession { get; set; }
Я "скопировал реализацию RavenDbUnitOfWork из NServiceBus".Веб-сайт
Я зарегистрировал IDocumentStore, IDocumentSession и IManageUnitsOfWork в своем контейнере Windsor следующим образом:
container.Register(
Component
.For<IManageUnitsOfWork>()
.ImplementedBy<RavenUnitOfWork>()
.LifestyleTransient()
);
container.Register(
Component
.For<IDocumentStore>()
.UsingFactoryMethod(k => DocumentStoreHolder.DocumentStore)
.LifestyleSingleton(),
Component
.For<IDocumentSession>()
.UsingFactoryMethod(k => k.Resolve<IDocumentStore>().OpenSession())
.LifestyleTransient()
);
NServiceBus настроен на использование моего контейнера:
Configure.With()
.CastleWindsorBuilder(container);
Я столкнулся с проблемой, что UnitOfWork и обработчик сообщений получают разные экземпляры DocumentSession. Это означает, что объекты, хранящиеся в сеансе в обработчике сообщений, не сохраняются, так как SaveChanges () вызывается в другом DocumentSession.
Удаление временного образа жизни вызывает проблемы различного рода, которые приводят к параллелизму / конфликтам при обновлении объектов из RavenDb, поскольку (вероятно) обработчик сообщений продолжает получать один и тот же экземпляр DocumentSession, который содержит кэшированную версию обновленного объекта.
Update:
Как было предложено, я попытался изменить регистрацию IDocumentSession в Виндзоре на стиль жизни Scope, например:
Component
.For<IDocumentSession>()
.UsingFactoryMethod(k => k.Resolve<IDocumentStore>().OpenSession())
.LifestyleScope()
Это вызывает исключения, когда контейнер пытается разрешить контроллер MVC, говоря, что область не найдена, и спрашивая, не забыл ли я вызвать BeginScope ().