Управление сессией 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 ().

Ответы на вопрос(3)

Ваш ответ на вопрос