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