【问题标题】:NHibernate event listenersNHibernate 事件监听器
【发布时间】:2011-04-25 00:41:12
【问题描述】:

我正在尝试使用 FluentNHibernate 将 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();

但我只能通过单步执行代码来确定我要覆盖的内容来了解​​默认事件侦听器。我想在不覆盖任何现有事件侦听器的情况下添加我的事件侦听器,但是对我来说,像上面显示的那样这样做似乎很臭。现有的事件侦听器以数组的形式公开(而不是更有意义的集合或列表)。有没有更清洁的方法来处理这个问题?

【问题讨论】:

标签: nhibernate


【解决方案1】:

你的意思是这样的:

using System.Linq;

...

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

应该可以的:)

【讨论】:

    【解决方案2】:

    你可以扩展默认的...

    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 没有...

    【讨论】:

    • 这是我的问题。取决于我拥有的代码意味着我依赖于未明确定义/链接的行为,并且可能会随着未来的实现而改变。此外,我直接实现接口,因此如果将来需要其他实现,我不依赖于菊花链继承。
    • 也许最好走 mookid8000 的路线。我同意应该有一个 Add 方法而不是弄乱数组。我知道我使用了一些 Default 类的方法,例如 GetEntityState,所以我发现扩展更容易。
    猜你喜欢
    • 2011-07-05
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多