Zarządzanie sesją RavenDb w Windsor pod NServiceBus
Używam NServiceBus (3.2.2), RavenDB (1.2.2017-Unstable) i Windsor (3.0.0.4001) w projekcie MVC 4.
Mam klasę IHandleMessages, która obsługuje 3 różne komunikaty i która wymaga IDocumentSession, a zatem definiuje właściwość, taką jak:
public IDocumentSession DocumentSession { get; set; }
Skopiowałem implementację RavenDbUnitOfWork z NServiceBus 'stronie internetowej
Zarejestrowałem IDocumentStore, IDocumentSession i IManageUnitsOfWork w moim kontenerze Windsor w następujący sposób:
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 jest skonfigurowany do używania mojego kontenera:
Configure.With()
.CastleWindsorBuilder(container);
Napotykam problem polegający na tym, że UnitOfWork i program obsługi wiadomości odbierają różne instancje DocumentSession. Oznacza to, że obiekty przechowywane w sesji w procedurze obsługi komunikatów nie są zapisywane, ponieważ SaveChanges () jest wywoływane w innej DocumentSession.
Usunięcie przejściowego trybu życia powoduje różnego rodzaju problemy, które powodują współbieżność / konflikty podczas aktualizowania obiektów z RavenDb, ponieważ (prawdopodobnie) program obsługi komunikatów wciąż pobiera tę samą instancję DocumentSession, która zawiera buforowaną wersję zaktualizowanego obiektu.
Aktualizacja:
Zgodnie z sugestią, próbowałem zmienić rejestrację IDocumentSession w Windsor, na styl życia Scope, w ten sposób:
Component
.For<IDocumentSession>()
.UsingFactoryMethod(k => k.Resolve<IDocumentStore>().OpenSession())
.LifestyleScope()
Powoduje to wyjątki, gdy kontener próbuje rozwiązać kontroler MVC, mówiąc, że zakres nie został znaleziony, i pytając, czy zapomniałem wywołać BeginScope ().