有多个NHibernate事件侦听器是个好主意吗?

有多个NHibernate事件侦听器是个好主意吗?,nhibernate,Nhibernate,我们刚刚从NHibernate开始,一直在看NH Cookbook 3.0,它突出显示了使用EventListener在对象上打上标记,标记是谁创建了对象,何时,然后是谁更改了对象,何时。我们现在正在考虑实现一个审计跟踪事件监听器(创建属性值更改的历史记录)。最好的做法是让两个(或更多)事件侦听器分别处理一个任务,或者让一个事件侦听器处理多个任务 因此,单事件侦听器代码如下所示: public class EventListener : IPreInsertEventListener, IPre

我们刚刚从NHibernate开始,一直在看NH Cookbook 3.0,它突出显示了使用EventListener在对象上打上标记,标记是谁创建了对象,何时,然后是谁更改了对象,何时。我们现在正在考虑实现一个审计跟踪事件监听器(创建属性值更改的历史记录)。最好的做法是让两个(或更多)事件侦听器分别处理一个任务,或者让一个事件侦听器处理多个任务

因此,单事件侦听器代码如下所示:

public class EventListener : IPreInsertEventListener, IPreUpdateEventListener
{
    ...
    ...
    public bool OnPreUpdate(PreUpdateEvent e)
    {
        _stamper.Update(e.Entity as IStampedEntity, e.OldState, e.State, e.Persister);
        _auditTracker.Update(e.Entity as IAuditTrackedEntity, e.OldState, e.State, e.Persister);
        return false;
    }
}
public class StamperEventListener : IPreInsertEventListener, IPreUpdateEventListener
{
    ...
    ...
    public bool OnPreUpdate(PreUpdateEvent e)
    {
        _stamper.Update(e.Entity as IStampedEntity, e.OldState, e.State, e.Persister);
        return false;
    }
}

public class AuditHistoryEventListener : IPreUpdateEventListener
{
    ...
    ...
    public bool OnPreUpdate(PreUpdateEvent e)
    {
        _auditTracker.Update(e.Entity as IAuditTrackedEntity, e.OldState, e.State, e.Persister);
        return false;
    }
}
而双事件侦听器模型类似于:

public class EventListener : IPreInsertEventListener, IPreUpdateEventListener
{
    ...
    ...
    public bool OnPreUpdate(PreUpdateEvent e)
    {
        _stamper.Update(e.Entity as IStampedEntity, e.OldState, e.State, e.Persister);
        _auditTracker.Update(e.Entity as IAuditTrackedEntity, e.OldState, e.State, e.Persister);
        return false;
    }
}
public class StamperEventListener : IPreInsertEventListener, IPreUpdateEventListener
{
    ...
    ...
    public bool OnPreUpdate(PreUpdateEvent e)
    {
        _stamper.Update(e.Entity as IStampedEntity, e.OldState, e.State, e.Persister);
        return false;
    }
}

public class AuditHistoryEventListener : IPreUpdateEventListener
{
    ...
    ...
    public bool OnPreUpdate(PreUpdateEvent e)
    {
        _auditTracker.Update(e.Entity as IAuditTrackedEntity, e.OldState, e.State, e.Persister);
        return false;
    }
}

哪一种被认为是最佳实践?这两种方法都有性能缺陷吗?后者(两个独立的事件侦听器)似乎是澄清和维护的最佳实现,但不确定它是否会在以后给我们带来问题。

即使出于可维护性的原因,我也会坚持使用单独的实现-我在几个最新的项目中使用了这种方法,没有任何问题。。谁知道呢,也许在将来的某个时候,您会希望在一个侦听器中提供特定的行为——在这种情况下,您只需将配置重新指向新的侦听器/实现,而不会影响现有代码。只有我的2美分。

在大多数情况下,不应该有明显的性能影响,所以我倾向于为每个问题设置一个单独的事件侦听器


这将有助于提高可维护性、可测试性、重用性等。

谢谢,也支持我的想法。作为一个快速更新,以及NH 3.0 Cookbook中推荐的stamper,我们使用本文中引用的模型添加了一个完整的审计跟踪程序:。因此,需要两个事件侦听器。