2009-09-16 82 views
15

我想添加一個事件偵聽器(IPreUpdateEventListener)添加NHibernate,但我似乎無法找到一個例子,當使用流暢的配置。如何通過Fluent NHibernate添加事件監聽器?

我希望能夠在創建會話工廠時添加偵聽器,例如,當執行下面的代碼時。

_sessionFactory = Fluently.Configure() 
    .Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString).ShowSql()) 
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<IEntity>()) 
    .BuildSessionFactory(); 

任何人都知道如何做到這一點?

回答

12

最新回答,找到你的問題,當我試圖做同樣的事情。研究發現,應該工作的解決方案:

_sessionFactory = Fluently.Configure() 
    .Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString).ShowSql()) 
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Entity>()) 
    .ExposeConfiguration(c => c.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] {new AuditEventListener()}); 
+3

請仔細閱讀該代碼。實際上,您將刪除現有的事件偵聽器,而不是將您自己的事件添加到列表中。我剛剛發現,如果我嘗試在FluentNH中使用樂觀鎖定(使用版本映射),它將無法工作,因爲它會自動註冊一些事件偵聽器,並且您提供的代碼會將其移除。 – 2011-02-15 16:11:22

+1

好的,一個更正:我忽略了錯誤的聽衆進行審計。但是我的問題依然存在:假設在調用ExposeConfiguration時可以刪除任何現有的偵聽器是否明智? – 2011-02-15 16:43:40

31

所以,反應遲緩,但爲後人着想,增加聽衆無需移除現有的註冊聽衆(像本特更早的答案要會做):

var config = new Configuration(); 
config.AppendListeners (ListenerType.PreUpdate, new [] { new AuditEventListener() }); 

+0

這爲我工作,除了它最終追加偵聽器兩次。一定是我的配置有問題。設置而不是附加工作,它只調用一次OnPreUpdate方法。 – shanabus 2013-12-18 20:14:30

6

復活死在這裏,但這樣的:

........ 
    .ExposeConfiguration(c => c.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] {new AuditEventListener()}); 

應該是:

.ExposeConfiguration(c => c.AppendListeners(ListenerType.PreUpdate, new object[] 
    { 
     new AuditEventListener() 
    }); 

我相信'SetListener'方法(在另一個答案中描述)也會刪除所有以前的偵聽器。

如果你到一些更動態的,你可以這樣做:

private void AddListenerToConfiguration<T>(FluentConfiguration config, params ListenerType[] typesForListener) 
     where T : class 
    { 
     var listener = Activator.CreateInstance<T>(); 

     config.ExposeConfiguration(x => 
      { 
       foreach (var listenerType in typesForListener) 
       { 
        x.AppendListeners(listenerType, new T[] 
        { 
         listener 
        }); 
       } 
      }); 
    } 

然後調用是這樣的:

AddListenerToConfiguration<AuditEventListener>(smFactory, 
      ListenerType.PreUpdate); 

這樣就可以更清晰的代碼,而你是在看Fluent配置。它還允許您輕鬆地將單一類型註冊到多個偵聽器類型。

至於刪除默認偵聽器,我不會刪除它們,除非我有一個偵聽器從默認偵聽器實現中繼承,並在重寫的方法上調用base.METHODNAME,或者複製與默認偵聽器相同的行爲。