Estoy usando NServiceBus (3.2.2), RavenDB (1.2.2017-Inestable) y Windsor (3.0.0.4001) en un proyecto de MVC 4.Administrar la sesión de RavenDb en Windsor bajo NServiceBus
tengo una clase que maneja IHandleMessages 3 mensajes diferentes, y que necesita un IDocumentSession, y por lo tanto define una propiedad, tales como:
public IDocumentSession DocumentSession { get; set; }
He copiado la implementación de RavenDbUnitOfWork NServiceBus' website
me he registrado IDocumentStore, IDocumentSession y 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 utilizar mi contenedor:
Configure.With()
.CastleWindsorBuilder(container);
me encuentro con el problema de que el UnitOfWork y el controlador de mensajes reciben diferentes instancias de la 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.
Eliminar el estilo de vida transitorio causa diferentes tipos de problemas, que resultan en concurrencia/conflictos al actualizar objetos de RavenDb, ya que (probablemente) el manejador de mensajes sigue recibiendo la misma instancia de DocumentSession, que contiene una versión almacenada en caché objeto.
Actualización:
Como se ha sugerido, He intentado cambiar el registro de la IDocumentSession en Windsor, al estilo de vida Ámbito de aplicación, así:
Component
.For<IDocumentSession>()
.UsingFactoryMethod(k => k.Resolve<IDocumentStore>().OpenSession())
.LifestyleScope()
Esto hace excepciones cuando los tries de contenedores para resolver el controlador MVC, diciendo que no se encontró el alcance, y preguntando si olvidé llamar a BeginScope().
se puede añadir a la definición DocumentStoreHolder? –