2011-02-28 184 views
2

是否可以註冊多個事件監聽器?NHibernate多事件監聽器

我們目前使用.ExposeConfiguration(AddSoftDelete)註冊事件偵聽器,其中AddSoftDelete是註冊偵聽器的類;

private static void AddSoftDelete(Configuration config) 
{ 
    config.SetListener(ListenerType.Delete, new SoftDeleteListener()); 
} 

我們已經發現,我們無法註冊相同類型的多個事件偵聽器,即我們不能註冊多個監聽器「ListenerType.Delete」。

是否可以註冊新的聽衆而不會覆蓋任何現有的聽衆?

解決...

已成功地註冊使用下面的代碼多受話器。

config.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] 
                   { 
                    new Listener1(), 
                    new Listener2() 
                   }; 

對每個ListenerType重複。

回答

0

聽衆實際上不是聽衆,他們是實現者。只有一個「事件」的實現。

您可以實現一個偵聽器,您可以在其中插入多個實現。例如針對不同實體類型的實現。您可以將「事件」傳遞給每個實現,直到其中一個處理它爲止(例如,當實現接口ISoftDeletable時,SoftDeleteImplementor正在處理它)。你需要關心競爭性的實現者(更多的人可以處理它,這個命令對你來說很重要)。

+0

這對我來說很有意義,這是一個非常好的解釋,它將我的想法引向正確的軌道! – Wozart 2011-02-28 13:18:58

0

爲什麼需要註冊多個ListenerType.Delete?

如果您在一種類型上有多個事件偵聽器,那麼應​​用程序會出現一些性能問題。如果你想用這個監聽器來處理不同的實體,那麼在你的SoftDeleteListener類中。

+0

我同意,這只是一個例子而已。問題與註冊多個相同類型的監聽器有關。如果有幫助,我們假設偵聽器是不同的類型,即PostUpdate,PreInsert等。 – Wozart 2011-02-28 07:27:38

+0

OK。只需添加另一行「config.SetListener(ListenerType.Delete,new SoftDeleteListener());」。而已。 – 2011-02-28 08:05:43

0

我在我的代碼中做了類似的事情。 NHibernate.Cfg.Configuration對象應該有一個AppendListeners(ListenerType類型,object []偵聽器)方法。

還有一個SetListeners方法,我假設它會替代偵聽器列表而不是添加到它。

+1

有一個'SetListeners(ListenerType,object [])'方法應該執行你所描述的。 – 2011-04-11 09:25:30