How to add event listener via Fluent NHibernate?

2019-08-06 22:33发布

我想添加一个事件侦听器( IPreUpdateEventListener )添加NHibernate的,但我似乎无法用流利的配置时找到一个例子。

我希望能够当我创建会话工厂,例如,当下面的代码是执行添加监听器。

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

有人知道怎么做吗?

Answer 1:

迟到的回答,发现你的问题,当我试图做同样的。 研究发现,应该工作的解决方案:

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


Answer 2:

因此,反应迟缓,但为后人着想,增加听众无需移除现有的注册听众(如本特从早期的答案要会做):

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

等等



Answer 3:

在这里复活死人,但这:

........
   .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);

这样就可以更清晰的代码,而你是在看流利的配置。 它还可以让你轻松地注册一个单一型向多个监听器类型。

至于删除默认的监听器,除非我有一个从默认的监听器实现继承和重载的方法调用base.METHODNAME或复制相同的行为作为默认的监听器的监听器,我不会删除它们。



文章来源: How to add event listener via Fluent NHibernate?