【发布时间】: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