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