2010-10-13 157 views
5

我想添加一個IPostLoadEventListener實現到我的NHibernate配置使用FluentNHibernate。我可以這樣做如下說明:NHibernate事件監聽器

how to add event listener via fluent nhibernate?

然而,創建一個新的陣列,以取代舊的完全丟棄任何現有的事件偵聽。我能得到周圍像這樣:

return Fluently.Configure() 
    .Database(config) 
    .Mappings(m => m.AutoMappings.Add(mappings)) 
    .ExposeConfiguration(cfg => 
     { 
      cfg.EventListeners.PostLoadEventListeners = 
       new IPostLoadEventListener[] { 
        new UtcDateEventListener(), 
        new DefaultPostLoadEventListener() // <<< this one is the default 
       }; 
      cfg.EventListeners.SaveOrUpdateEventListeners = 
       new ISaveOrUpdateEventListener[] { 
        new UtcDateEventListener(), 
        new DefaultSaveOrUpdateEventListener() // <<< this one is the default 
       }; 
     }) 
    .BuildConfiguration() 
    .BuildSessionFactory(); 

但我只知道通過代碼加強,以確定什麼,我覆蓋默認事件偵聽器。我想添加我的事件偵聽器而不覆蓋任何現有的事件偵聽器,但是對於我來說,像我上面顯示的那樣執行此操作似乎非常臭。現有的事件監聽器被暴露爲一個數組(而不是一個集合或列表,這會更有意義)。有沒有更好的方法來處理這個問題?

+0

但是,這是一箇舊帖子,但我在這裏找到了一個有趣的鏈接:http://codebetter.com/petervanooijen/2015/04/13/using-nhibernate -eventlisteners-to-validate-and-audit-data/ – shankbond 2017-06-08 09:48:48

回答

5

你的意思是這樣的:

using System.Linq; 

... 

var list = cfg.EventListeners.PostLoadEventListeners.ToList(); 
list.Add(new MyPostLoadEventListener()); 
cfg.EventListeners.PostLoadEventListeners = list.ToArray(); 

這應該工作:)

1

你可以只擴展默認的...

public class UtcDatePostLoadEventListener : DefaultPostLoadEventListener 
{ 
    public override void OnPostLoad(PostLoadEvent @event) 
    { 
     base.OnPostLoad(@event); 
    } 
} 

public class UtcDateSaveOrUpdateEventListener : DefaultSaveOrUpdateEventListener 
{ 
    public override void OnSaveOrUpdate(SaveOrUpdateEvent @event) 
    { 
     base.OnSaveOrUpdate(@event); 
    } 
} 

但是,我不確定你是如何知道何時存在違約的。例如,PreUpdateEventListener沒有...

+0

這是我的問題。取決於代碼,我意味着我依賴於未明確定義/鏈接的行爲,並可能隨着未來的實現而改變。另外,我正在直接實現這些接口,以便如果將來需要額外的實現,我不依賴於菊花鏈繼承。 – Chris 2010-10-13 19:30:46

+0

也許最好去mookid8000的路線。我同意應該有一個Add方法,而不是搞亂數組。我知道我使用了一些Default類的方法,比如'GetEntityState',所以我發現它更容易擴展。 – dotjoe 2010-10-13 19:45:33