Управление сеансом RavenDb в Windsor с помощью 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()
               .ImplementedBy()
               .LifestyleTransient()
            );
container.Register(
            Component
               .For()
               .UsingFactoryMethod(k => DocumentStoreHolder.DocumentStore)
               .LifestyleSingleton(),
            Component
               .For()
               .UsingFactoryMethod(k => k.Resolve().OpenSession())
               .LifestyleTransient()
            );

NServiceBus настроен на использование моего контейнера:

Configure.With()
        .CastleWindsorBuilder(container);

Я столкнулся с проблемой, что UnitOfWork и обработчик сообщений получают разные экземпляры DocumentSession. Это означает, что объекты, хранящиеся в сеансе в обработчике сообщений, не сохраняются, поскольку SaveChanges ()вызывается в другом DocumentSession.

Удаление образа жизни Transient вызывает различного рода проблемы, которые приводят к параллелизму/конфликтам при обновлении объектов из RavenDb, поскольку (вероятно, )обработчик сообщений продолжает получать один и тот же экземпляр DocumentSession, который содержит кэшированную версию обновленного объект.

Обновление:

Как было предложено, я попытался изменить регистрацию IDocumentSession в Виндзоре на образ жизни Scope, например:

Component
   .For()
   .UsingFactoryMethod(k => k.Resolve().OpenSession())
   .LifestyleScope()

Это вызывает исключения, когда контейнер пытается разрешить контроллер MVC, сообщая, что область не найдена, и спрашивая, не забыл ли я вызвать BeginScope ().

5
задан SaguiItay 8 August 2012 в 11:36
поделиться