NHibernate事件监听器

时间:2010-10-13 18:52:28

标签: nhibernate

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

但我只是通过单步执行代码来确定我覆盖的默认事件监听器。我想添加我的事件监听器而不会覆盖任何现有的事件监听器,但是就像我上面所示,这样做对我来说似乎非常臭。现有的事件侦听器作为数组公开(而不是集合或列表,这将更有意义)。是否有更清洁的方法来处理这个问题?

2 个答案:

答案 0 :(得分:5)

你的意思是这样的:

using System.Linq;

...

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

这应该有效:)

答案 1 :(得分:1)

你可以扩展默认值......

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