代码之家  ›  专栏  ›  技术社区  ›  Chris

非车载事件监听器

  •  5
  • Chris  · 技术社区  · 14 年前

    我正在尝试使用FluentHibernate将ipostLoadEventListener的实现添加到我的nhibernate配置中。我可以这样做,如图所示:

    how to add event listener via fluent nhibernate?

    但是,创建一个新数组来替换旧数组会完全丢弃任何现有的事件侦听器。我可以这样绕过它:

    return Fluently.Configure()
        .Database(config)
        .Mappings(m => m.AutoMappings.Add(mappings))
        .ExposeConfiguration(cfg =>
            {
                cfg.EventListeners.PostLoadEventListeners =
                    new IPostLoadEventListener[] { 
                        new UtcDateEventListener(),
                        new DefaultPostLoadEventListener() // <<< this one is the default
                    };
                cfg.EventListeners.SaveOrUpdateEventListeners =
                    new ISaveOrUpdateEventListener[] { 
                        new UtcDateEventListener(),
                        new DefaultSaveOrUpdateEventListener() // <<< this one is the default
                    };
            })
        .BuildConfiguration()
        .BuildSessionFactory();
    

    但我只通过单步执行代码来确定我正在重写的内容,从而了解默认事件侦听器。我想添加我的事件监听器而不覆盖任何现有的事件监听器,但是这样做就像我上面所显示的那样,对我来说,看起来很难闻。现有的事件侦听器以数组的形式公开(而不是集合或列表,这更有意义)。有没有更干净的方法来处理这个?

    2 回复  |  直到 14 年前
        1
  •  5
  •   mookid8000    14 年前

    你的意思是这样的吗?

    using System.Linq;
    
    ...
    
    var list = cfg.EventListeners.PostLoadEventListeners.ToList();
    list.Add(new MyPostLoadEventListener());
    cfg.EventListeners.PostLoadEventListeners = list.ToArray();
    

    那就行了:)

        2
  •  1
  •   dotjoe    14 年前

    你可以只扩展默认的…

    public class UtcDatePostLoadEventListener : DefaultPostLoadEventListener
    {
        public override void OnPostLoad(PostLoadEvent @event)
        {
            base.OnPostLoad(@event);
        }
    }
    
    public class UtcDateSaveOrUpdateEventListener : DefaultSaveOrUpdateEventListener
    {
        public override void OnSaveOrUpdate(SaveOrUpdateEvent @event)
        {
            base.OnSaveOrUpdate(@event);
        }
    }
    

    但是,我不知道你应该怎么知道什么时候有违约或没有。例如,PreUpdateEventListener没有任何…