2009-09-16 66 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,或者复制与默认侦听器相同的行为。