如何通过Fluent NHibernate添加事件监听器?

时间:2009-09-16 15:15:42

标签: c# .net nhibernate fluent-nhibernate event-listener

我想添加一个事件监听器(IPreUpdateEventListener)来添加NHibernate但是在使用流畅的配置时我似乎无法找到一个例子。

我希望能够在创建会话工厂时添加侦听器,例如当执行以下代码时。

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

任何人都知道怎么做?

3 个答案:

答案 0 :(得分:32)

所以,迟到的回应,但为了后代,添加听众而不删除现有的注册听众(就像Bengt Be的早期回答一样):

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

答案 1 :(得分:13)

迟到的答案,当我试图做同样的事情时发现了你的问题。找到了应该有效的解决方案:

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

答案 2 :(得分: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或复制与默认侦听器相同的行为,否则我不会删除它们。 / p>