【问题标题】:Is it a good idea to have multiple NHibernate EventListeners?拥有多个 NHibernate EventListener 是个好主意吗?
【发布时间】:2010-12-02 15:46:03
【问题描述】:

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

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

【问题讨论】:

  • 作为一个快速更新,以及 NH 3.0 Cookbook 中推荐的压模,我们使用此博客文章中引用的模型添加了一个完整的审计跟踪器:darrell.mozingo.net/2009/08/31/…。这就是两个事件监听器的原因。

标签: nhibernate


【解决方案1】:

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

【讨论】:

  • 谢谢,也支持我的想法。
【解决方案2】:

在大多数情况下,应该不会对性能产生明显影响,因此我倾向于为每个问题使用单独的事件侦听器。

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

【讨论】:

    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多