我有 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
有点像:
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
. 我尝试将 'current_session_context_class' 属性放在 NHibernate 配置中的 'thread_static' 中,但它不起作用。
为什么我的 NServiceBus 处理程序中有不同的工作单元?