拥有多个NHibernate EventListeners是个好主意吗?

时间:2010-12-02 15:46:04

标签: nhibernate

我们刚刚开始使用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;
    }
}

这被认为是最佳做法,是否有任何性能缺陷?后来(两个独立的事件监听器)似乎是澄清和维护的最佳实现,但只是不确定它是否会在以后引起我们的问题。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

在大多数情况下,不应该有明显的性能影响,因此我倾向于为每个问题单独监听事件。

这有助于可维护性,可测试性,重用等。