【问题标题】:How to add event listener via Fluent NHibernate?如何通过 Fluent NHibernate 添加事件监听器?
【发布时间】:2009-09-16 15:15:42
【问题描述】:

我想添加一个事件侦听器 (IPreUpdateEventListener) 来添加 NHibernate,但在使用流畅的配置时我似乎找不到示例。

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

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

有人知道怎么做吗?

【问题讨论】:

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


    【解决方案1】:

    因此,延迟响应,但为了后代,添加侦听器而不删除现有的注册侦听器(就像 Bengt Be 的早期回答一样):

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

    等等

    【讨论】:

    • 这对我有用,但它最终将监听器附加了两次。一定是我的配置有问题。设置而不是附加,因为它只调用一次 OnPreUpdate 方法。
    【解决方案2】:

    迟到的答案,当我尝试做同样的事情时发现了你的问题。找到了一个可行的解决方案:

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

    【讨论】:

    • 对该代码要非常小心。您实际上是在删除现有的事件侦听器,而不仅仅是将您自己的事件侦听器添加到列表中。我刚刚发现,如果我尝试在 FluentNH 中使用乐观锁定(使用版本映射),它将无法正常工作,因为它会自动注册一些事件侦听器,而您提供的代码会将它们删除。
    • 好的,更正一下:我覆盖了错误的侦听器进行审计。但是我的问题仍然存在:假设您可以在调用 ExposeConfiguration 时删除任何现有的侦听器是否明智?
    【解决方案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);
    

    当您查看 Fluent 配置时,这允许更简洁的代码。它还允许您轻松地将单个类型注册到多个侦听器类型。

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

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 2011-07-05
      • 2020-06-13
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多