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

Awk*_*der 17 .net c# nhibernate event-listener fluent-nhibernate

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

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

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

有人知道怎么做吗?

Mat*_*ght 32

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

var config = new Configuration ();
config.AppendListeners (ListenerType.PreUpdate, new [] { new AuditEventListener () });
Run Code Online (Sandbox Code Playgroud)

等等


Ben*_*tBe 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()});
Run Code Online (Sandbox Code Playgroud)

  • 对代码要非常小心.实际上,您正在删除现有的事件侦听器,而不是仅将其自己添加到列表中.我刚刚发现,如果我尝试在FluentNH中使用乐观锁定(使用版本映射),它将无法工作,因为它自动注册一些事件侦听器,并且您提供的代码将删除它们. (3认同)

doc*_*tan 6

在这里复活死者但是:

........
   .ExposeConfiguration(c => c.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] {new AuditEventListener()});
Run Code Online (Sandbox Code Playgroud)

应该:

.ExposeConfiguration(c => c.AppendListeners(ListenerType.PreUpdate, new object[]
    {
        new AuditEventListener()
    });
Run Code Online (Sandbox Code Playgroud)

我相信'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
                    });
                }
            });
    }
Run Code Online (Sandbox Code Playgroud)

然后调用这样的东西:

AddListenerToConfiguration<AuditEventListener>(smFactory, 
            ListenerType.PreUpdate);
Run Code Online (Sandbox Code Playgroud)

这样可以在查看Fluent配置时获得更清晰的代码.它还允许您轻松地将单个类型注册到多个侦听器类型.

至于删除默认侦听器,我不会删除它们,除非我有一个从默认侦听器实现继承的侦听器并在重写方法上调用base.METHODNAME或复制与默认侦听器相同的行为.