2012-06-06 101 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電話。