Gerenciando a sessão RavenDb em Windsor sob NServiceBus
Estou usando o NServiceBus (3.2.2), o RavenDB (1.2.2017-Unstable) e o Windsor (3.0.0.4001) em um projeto do MVC 4.
Eu tenho uma classe IHandleMessages que lida com 3 mensagens diferentes e que precisa de um IDocumentSession e, portanto, define uma propriedade como:
public IDocumentSession DocumentSession { get; set; }
Eu copiei a implementação do RavenDbUnitOfWork do NServiceBus 'local na rede Internet
Eu registrei IDocumentStore, IDocumentSession e IManageUnitsOfWork no meu contêiner do Windsor da seguinte forma:
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()
);
O NServiceBus está configurado para usar meu contêiner:
Configure.With()
.CastleWindsorBuilder(container);
Estou encontrando o problema que o UnitOfWork e o manipulador de mensagens recebem instâncias diferentes da DocumentSession. Isso significa que os objetos armazenados na sessão no manipulador de mensagens não são salvos, já que SaveChanges () é chamado em uma DocumentSession diferente.
Remover o estilo de vida Transiente causa diferentes tipos de problemas, que resultam em simultaneidade / conflitos ao atualizar objetos do RavenDb, já que (provavelmente) o manipulador de mensagens continua recebendo a mesma instância do DocumentSession, que mantém uma versão em cache do objeto atualizado.
Atualizar:
Como sugerido, tentei alterar o registro do IDocumentSession em Windsor, para o estilo de vida do Scope, assim:
Component
.For<IDocumentSession>()
.UsingFactoryMethod(k => k.Resolve<IDocumentStore>().OpenSession())
.LifestyleScope()
Isso faz com que exceções quando o contêiner tenta resolver o controlador MVC, dizendo que o escopo não foi encontrado e perguntando se eu esqueci de chamar BeginScope ().