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 ().

questionAnswers(3)

yourAnswerToTheQuestion