Gestionando la sesión de RavenDb en Windsor bajo NServiceBus

Estoy usando NServiceBus (3.2.2), RavenDB (1.2.2017-Unstable) y Windsor (3.0.0.4001) en un proyecto MVC 4.

Tengo una clase IHandleMessages que maneja 3 mensajes diferentes, y que necesita una IDocumentSession, y por lo tanto define una propiedad como:

public IDocumentSession DocumentSession { get; set; }

He copiado la implementación de RavenDbUnitOfWork desde NServiceBus 'sitio web

He registrado IDocumentStore, IDocumentSession e IManageUnitsOfWork en mi contenedor de Windsor de la siguiente manera:

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 está configurado para usar mi contenedor:

Configure.With()
         .CastleWindsorBuilder(container);

Estoy encontrando el problema de que UnitOfWork y el manejador de mensajes reciben diferentes instancias de DocumentSession. Esto significa que los objetos almacenados en la sesión en el controlador de mensajes no se guardan, ya que se llama a SaveChanges () en una DocumentSession diferente.

La eliminación del estilo de vida Transitorio causa diferentes tipos de problemas, que resultan en concurrencia / conflictos al actualizar objetos desde RavenDb, ya que (probablemente) el controlador de mensajes sigue obteniendo la misma instancia de DocumentSession, que contiene una versión en caché del objeto actualizado.

Actualizar:

Como se sugirió, he intentado cambiar el registro de la IDocumentSession en Windsor, al estilo de vida de Scope, de esta manera:

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

Esto causa excepciones cuando el contenedor intenta resolver el Controlador MVC, diciendo que no se encontró el alcance y preguntando si olvidé llamar a BeginScope ().

Respuestas a la pregunta(3)

Su respuesta a la pregunta