2012-06-06 38 views
0

我有NServiceBus(3.2.2)设置与城堡温莎作为它的建设者,我也使用NHibernate。我遇到的问题是,在我的处理程序中,如果我有多个需要NHibernate会话的存储库,它们将以不同会话结束!NServiceBus 3.2和子容器

的NServiceBus文件指出,在容器内的任何瞬态实例将作为实例进行处理。另外我的NHibernate会话被封装在一个工作抽象单元中。

这里是用来设置NServiceBus与NHibernate代码:

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成才是这样的:

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

所以当NHibernate的会议是需要,它就会与UnitOfWorkFactory创建。我尝试在NHibernate配置中将'current_session_context_class'属性设置为'thread_static',但它不起作用。

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

+0

我不相信:NServiceBus文档指出,容器内的任何瞬态实例都将被视为单例实例。 – mynkow

+0

@mynkow“NServiceBus为接收到的每个传输消息创建一个子容器,请记住传输消息可以包含多个”用户定义的消息“ 这意味着在该消息处理过程中创建的所有瞬态实例都在范围内作为单例子容器 这使您可以轻松地共享存储库之间的NHibernate会话,而无需使用线程静态缓存。“你可以找到相关的文档[这里](http://nservicebus.com/SupportForChildContainers.aspx) –

+0

它似乎已经改变,因为看源代码,你可以看到新的NServiceBus生命周期枚举'InstancePerUnitOfWork'这意味着“在实际工作中,这意味着处理单个传输消息“ ”,并且该值映射到“LifestyleType.Scoped”Windsor Castle enum ...所以我会尝试 –

回答

1

我通过使用Castle的LifestyleType.Scoped生活方式得到了它的工作。但是,由于现在明显的原因,我的处理程序被一次又一次地调用,直到消息被抛入错误队列中。之前我遇到过这个问题,它是在处理程序中回滚或提交事务。在我的工作单位中,我收回了Dispose方法中未提交的任何更改。我唯一需要做的只是处理会话并删除Rollback电话。