Nhibernate NServiceBus 3.2和子容器

Nhibernate NServiceBus 3.2和子容器,nhibernate,isession,nservicebus3,Nhibernate,Isession,Nservicebus3,我有NServiceBus(3.2.2)设置,以Castle Windsor为建设者,我也在使用NHibernate。我的问题是,在我的处理程序中,如果我有多个需要NHibernate会话的存储库,那么它们最终会使用不同的会话 NServiceBus文档声明,容器中的任何瞬态实例都将被视为单实例。此外,我的NHibernate会话被包装在工作单元抽象中 以下是使用NHibernate设置NServiceBus的代码: IWindsorContainer container = new Winds

我有NServiceBus(3.2.2)设置,以Castle Windsor为建设者,我也在使用NHibernate。我的问题是,在我的处理程序中,如果我有多个需要NHibernate会话的存储库,那么它们最终会使用不同的会话

NServiceBus文档声明,容器中的任何瞬态实例都将被视为单实例。此外,我的NHibernate会话被包装在工作单元抽象中

以下是使用NHibernate设置NServiceBus的代码:

IWindsorContainer container = new WindsorContainer(new XmlInterpreter());
container.Install(new ContainerInstaller());
container.Install(new UnitOfWorkInstaller(AppDomain.CurrentDomain.BaseDirectory, LifestyleType.Transient));
container.Install(new FactoryInstaller(AppDomain.CurrentDomain.BaseDirectory, LifestyleType.Transient));
container.Install(new RepositoryInstaller(AppDomain.CurrentDomain.BaseDirectory, LifestyleType.Transient));

Configure.With()
    .CastleWindsorBuilder(container)
    .FileShareDataBus(Properties.Settings.Default.DataBusFileSharePath)
    .MsmqTransport()
        .IsTransactional(true)
        .PurgeOnStartup(false)
    .UnicastBus()
         .LoadMessageHandlers()
         .ImpersonateSender(false)
     .JsonSerializer();
UnitOfWorkInstaller的
UnitOfWorkInstaller
类似于:

var fromAssemblyDescriptor = AllTypes.FromAssemblyInDirectory(new AssemblyFilter(_installationPath));
container.Register(fromAssemblyDescriptor
    .IncludeNonPublicTypes()
    .Pick()
    .If(t => t.GetInterfaces().Any(i => i == typeof(IUnitOfWork)) && t.Namespace.StartsWith("Magma"))
    .WithService.AllInterfaces()
    .Configure(con => con.LifeStyle.Is(_lifeStyleType).UsingFactoryMethod(k => k.Resolve<IUnitOfWorkFactory>().Create())));
var fromAssemblyDescriptor=AllTypes.FromAssemblyInDirectory(新的AssemblyFilter(_installationPath));
容器.寄存器(fromAssemblyDescriptor
.includeNoPublicTypes()
.Pick()
.If(t=>t.GetInterfaces().Any(i=>i==typeof(IUnitOfWork))&&t.Namespace.StartsWith(“Magma”))
.WithService.AllInterfaces()
.Configure(con=>con.LifeStyle.Is(_lifeStyleType).UsingFactoryMethod(k=>k.Resolve().Create());
因此,当需要NHibernate会话时,将使用
UnitOfWorkFactory
创建该会话。我尝试在NHibernate配置中将“current\u session\u context\u class”属性设置为“thread\u static”,但没有成功


为什么我的NServiceBus处理程序中有不同的工作单元?

我使用Castle的
生活方式类型。范围限定的
生活方式使其工作。但是,由于现在显而易见的原因,我的处理程序被一次又一次地调用,直到消息被抛出到错误队列中。我以前遇到过这个问题,它与回滚或在处理程序中提交事务有关。在我的工作单元中,我正在重新调用
Dispose
方法中任何未提交的更改。我唯一要做的就是处理会话并删除
回滚调用。

我不相信:NServiceBus文档声明容器中的任何临时实例都将被视为单实例。@mynkow“NServiceBus为接收到的每个传输消息创建一个子容器,请记住,传输消息可以包含多个“用户定义的消息”。这意味着在该消息处理过程中创建的所有瞬态实例都在子容器中作为单例进行作用域划分。这使您可以轻松地在存储库之间共享NHibernate会话,而无需使用线程静态缓存。“您可以找到相关文档,因为查看源代码,您可以看到新的NServiceBus lifecycle enum
InstancePerUnitOfWork
意味着”在工作单元的持续时间内,该实例将是单例的。实际上,这意味着处理单个传输消息”,并且该值映射到
LifestyleType.Scoped
Windsor Castle enum…所以我也会尝试一下,当您使用'current_session_context_class'时,您应该得到类似sessionFactory.GetCurrentSession()的会话@mynkow是的,我正在考虑重构这部分代码,这样我就可以使用NHibernate的会话上下文功能,而不是使用工厂方法创建ISession并让容器管理其生命周期