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

questionAnswers(3)

yourAnswerToTheQuestion