Я использую 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 ().