2010-06-01 104 views
2

我想實現一個使用ninject和NHibernate的觀察者模式。Ninject/NHibernate事件+觀察者模式

我希望能夠通過NHibernate持久化或刪除對象時,能夠注入充當「觸發器」的觀察者。

關鍵點 -

  1. 我想觀察者通知的對象持久化任何時候,包括級聯保存,這就是爲什麼我使用NHibernate PostInsert/PostUpdate事件。
  2. 我希望能夠通過Ninject注入觀察者(不想在nhibernate事件處理程序中的任何地方)。
  3. 根據持久化對象的類型,觀察者是不同的,所以我需要一個很好的方法來知道應該在NHibernate事件中調用哪些觀察者。

我的代碼現在對使用構造函數注入通過NHibernate加載的對象非常有效。一個觀察者類被注入域模型,它通過nhibernate事件進行,並且可以被解僱沒有問題。

問題:我們現有的代碼庫使用我們的域對象與工廠的默認構造函數。因此,除非我們改用工廠,否則觀察員將不會注入。

我知道將所有內容切換到工廠都可以,但我想看看是否有人有更好的建議來完成此任務。那麼,我應該讓工廠來實例化新對象還是其他東西?

+0

所以你不能把構造函數與在構造函數的參數列出的依賴關係的域對象的? – AaronHS 2012-02-16 11:16:28

回答

1

它看起來像你正在使自己的生活變得複雜,試圖把觀察者模式放在NHibernate的事件處理程序模式之上。

NHibernate已經提供了一種具有可插入事件監聽器的方法 - 爲什麼不使用它呢?

class FooPostInsertEventListener : IPostInsertEventListener 
{ 
    public void OnPostInsert(PostInsertEvent @event) 
    { 
     var entity = @event.Entity; 
     var entityType = entity.GetType(); 

     if (entityType != typeof(Foo)) return; 

     ProcessFoo(entity); 
    } 
} 

如果你是不顧一切要經過內核,那麼你甚至可以配置NHibernate的時候使用的內核。事情是這樣的:

config.EventListeners.PostInsertEventListeners = Kernel.GetAll<IPostInsertEventListener>().ToArray();