Verwalten der RavenDb-Sitzung in Windsor unter NServiceBus

Ich verwende NServiceBus (3.2.2), RavenDB (1.2.2017-Unstable) und Windsor (3.0.0.4001) in einem MVC 4-Projekt.

Ich besitze eine IHandleMessages-Klasse, die drei verschiedene Nachrichten verarbeitet und eine IDocumentSession benötigt. Sie definiert daher eine Eigenschaft wie die folgende:

public IDocumentSession DocumentSession { get; set; }

Ich habe die RavenDbUnitOfWork-Implementierung von NServiceBus kopiert.Webseite

Ich habe IDocumentStore, IDocumentSession und IManageUnitsOfWork in meinem Windsor-Container wie folgt registriert:

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 ist für die Verwendung meines Containers konfiguriert:

Configure.With()
         .CastleWindsorBuilder(container);

Ich habe das Problem, dass UnitOfWork und der Message-Handler unterschiedliche Instanzen der DocumentSession empfangen. Dies bedeutet, dass in der Sitzung im Nachrichtenhandler gespeicherte Objekte nicht gespeichert werden, da SaveChanges () in einer anderen DocumentSession aufgerufen wird.

Das Entfernen des vorübergehenden Lebensstils verursacht verschiedene Probleme, die zu Nebenläufigkeiten / Konflikten beim Aktualisieren von Objekten aus RavenDb führen, da (wahrscheinlich) der Nachrichtenhandler weiterhin dieselbe Instanz von DocumentSession abruft, die eine zwischengespeicherte Version des aktualisierten Objekts enthält.

Aktualisieren:

Wie vorgeschlagen, habe ich versucht, die Registrierung der IDocumentSession in Windsor in den Scope-Lebensstil wie folgt zu ändern:

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

Dies führt zu Ausnahmen, wenn der Container versucht, den MVC-Controller aufzulösen, der angibt, dass der Bereich nicht gefunden wurde, und fragt, ob ich vergessen habe, BeginScope () aufzurufen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage