0

我有 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 处理程序中有不同的工作单元?

4

1 回答 1

1

我通过使用 Castle 的LifestyleType.Scoped生活方式让它发挥作用。但是,由于现在显而易见的原因,我的处理程序被一次又一次地调用,直到消息被扔到错误队列中。我之前遇到过这个问题,它与在处理程序中回滚或提交事务有关。在我的工作单元中,我正在重新回滚该Dispose方法中任何未提交的更改。我唯一要做的就是处理会话并删除Rollback呼叫。

于 2012-06-08T11:51:25.583 回答