Używam NServiceBus (3.2.2), RavenDB (1.2.2017-Unstable) i Windsor (3.0.0.4001) w projekcie MVC 4.Zarządzanie sesją RavenDb w Windsor pod NServiceBus
Mam klasy IHandleMessages który obsługuje 3 różne wiadomości, i że potrzebuje IDocumentSession, a więc określa właściwości takie jak:
public IDocumentSession DocumentSession { get; set; }
Mam skopiowane wdrożenia RavenDbUnitOfWork z NServiceBus' website
mam zarejestrowany IDocumentStore, IDocumentSession i IManageUnitsOfWork w moim zbiorniku Windsor następująco:
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 korzystania z mojego kontenera:
Configure.With()
.CastleWindsorBuilder(container);
ja napotykają problem, że UnitOfWork i obsługi wiadomości otrzymane różne instancje DocumentSession. Oznacza to, że obiekty przechowywane w sesji w module obsługi komunikatów nie są zapisywane, ponieważ funkcja SaveChanges() jest wywoływana w innej sesji DocumentSession.
Usunięcie stylu życia przejściowego powoduje różnego rodzaju problemy, które powodują współbieżność/konflikty podczas aktualizowania obiektów z RavenDb, ponieważ (prawdopodobnie) program obsługi wiadomości wciąż pobiera to samo wystąpienie sesji DocumentSession, która przechowuje buforowaną wersję zaktualizowanego obiekt.
Aktualizacja:
Jak sugeruje, próbowałem zmienić rejestrację IDocumentSession w Windsor, do życia Zakres, tak:
Component
.For<IDocumentSession>()
.UsingFactoryMethod(k => k.Resolve<IDocumentStore>().OpenSession())
.LifestyleScope()
Powoduje to wyjątki, gdy próbuje kontenerów rozwiązać kontroler MVC, mówiąc, że zasięg nie został znaleziony i pytając, czy zapomniałem zadzwonić do BeginScope().
można dodać definicję do DocumentStoreHolder? –