NServiceBus 3.2和子容器

时间:2012-06-06 18:49:03

标签: nhibernate isession nservicebus3

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

1 个答案:

答案 0 :(得分:1)

我使用Castle的LifestyleType.Scoped生活方式让它变得有效。但是,由于显而易见的原因,我的处理程序一次又一次地被调用,直到消息被抛出错误队列。我之前遇到过这个问题,它与回滚或在处理程序中提交事务有关。在我的工作单元中,我对Dispose方法中任何未提交的更改进行了回馈。我唯一要做的就是只处理会话并删除Rollback电话。