我有使用Castle Windsor作为构建器的NServiceBus(3.2.2)设置,我也使用NHibernate。我遇到的问题是,在我的处理程序中,如果我有多个需要NHibernate会话的存储库,他们最终会得到不同的会话!
NServiceBus文档指出容器中的任何瞬态实例都将被视为 singleton 实例。我的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
就像:
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 :(得分:1)
我使用Castle的LifestyleType.Scoped
生活方式让它变得有效。但是,由于显而易见的原因,我的处理程序一次又一次地被调用,直到消息被抛出错误队列。我之前遇到过这个问题,它与回滚或在处理程序中提交事务有关。在我的工作单元中,我对Dispose
方法中任何未提交的更改进行了回馈。我唯一要做的就是只处理会话并删除Rollback
电话。