2010-11-18 73 views
2

我如何注入nservice總線使用的當前會話工廠到自定義saga finder?設置會話工廠

我曾嘗試使用下面的代碼

NServiceBus.Configure.With() 
       .CastleWindsorBuilder() 
       .Sagas() 
       .NHibernateSagaPersister() 
       .XmlSerializer(); 

初始化的傳奇和我有一個sagafinder

public sagafinder:saga<...> 
{ 
private ISessionFactory sessionFactory; 

     public virtual ISessionFactory SessionFactory 
     { 
      get { return sessionFactory; } 
      set { sessionFactory = value; } 
     } 
} 

但這會話工廠總是來爲空。 我知道我沒有設置會話工廠。我可以如何設置它?

感謝, Ajai

+0

由於您使用的是NH持久存儲器,只要您在實現Saga 時重寫ConfigureHowToFindSaga()方法,就可以處理查找Saga。你能評論你的情況如何不被內置機制滿足嗎? – 2010-11-18 15:55:01

回答

0

在問題的代碼看起來並不像一個傳奇取景器都沒有。我看到的是一個傳奇本身。如果你只是想根據消息中的某些屬性來尋找傳奇,亞當的建議是正確的。你不需要會話工廠,只需重寫ConfigureHowToFindSaga()。如果您正在嘗試做其他事情,那麼nhibernate saga persister使用的會話工廠沒有註冊到您的容器中,這樣您就可以解決傳奇中的依賴關係。不過,你真的想要查詢自己存儲的傳奇,可能性很小。所以,如果你真的有這個理由,我可能會建議你在數據庫中註冊一個會話工廠,並附上傳奇信息,讓nservicebus有它自己的。但很難想象你真的想要。

2

根據這篇文章的年齡來判斷,我會假設你使用的是像2.6這樣的NServiceBus之前的3版本。

我一直在研究這個和編寫用於構建NHibernateSagaPersister的Saga Finders是一個難題。

NHibernateSagaFinder使用已被烘焙到NServiceBus.Core.dll中的Ilmerged版本的NHibernate。所以,當你寫以下(從默認的傳奇取景器撕開):

public class MySagaFinder : IFindSagas<MySaga> 
{ 
    public NHibernate.ISession Session {get; set;} 
    ... 
} 

這裏的Isession將引用一個在NHibernate.dll你referrenced沒有NServiceBus的內部NHibernate的。據我可以告訴它不可能引用NServiceBus.Core的NHibernate,因爲它是「內部」。這意味着NServiceBus使用的IOC容器將不會注入會話,或者根據設置的方式注入錯誤的會話。

我一直在尋找這一段時間,我認爲最好的(唯一)的事情就是創建一個基於NServiceBus內置的自定義SagaFinder。這應該不難,因爲它在GitHub上的代碼庫中。

這可能會修復NServiceBus(> = 3)的更高版本,但我不確定,因爲我認爲他們現在使用RavenDB的默認傳奇持久性。