我最近发现了如何使用IPreDeleteEventListener
命名空间中的IPreInsertEventListener
,IPreUpdateEventListener
和NHibernate.Event
审核实例。
然而,这仍然让我感到困惑的是,这些事件会在成功或不成功的结局中返回。
例如,让我们来看看Ayende在这里找到的博客文章:
按照他的例子,可以实现以下接口:
public class AuditEventListener : IPreInsertEventListener {
public bool OnPreInsert(OnPreInsert @event) {
var audit = @event.Entity as IHaveAuditInformation;
if (audit == null) return false;
var time = DateTime.Now;
var name = WindowsIdentity.GetCurrent().Name;
Set(@event.Persister, @event.State, "CreatedAt", time);
Set(@event.Persister, @event.State, "CreatedBy", name);
audit.CreatedAt = time;
audit.CreatedBy = name;
return false;
}
}
将true
或false
作为返回值返回实际意味着什么颂歌,因为我有另一个例子,其中返回true
而不是Ayende写的false
。
似乎返回true
而不是false
。
public class SoftDeletableListener : IPreDeleteEventListener {
public void Register(Configuration cfg) {
cfg.EventListeners.PreDeleteEventListeners =
new IPreDeleteEventListener[] { this }
.Concat(cfg.EventListeners.PreDeleteEventListeners)
.ToArray();
}
public Boolean OnPreDelete(PreDeleteEvent @event) {
ISoftDeletable softDeletable = @event.Entity as ISoftDeletable;
if (softDeletable == null) return true;
EntityEntry entry = @event.Session
.GetSessionImplementation()
.PersistenceContext
.GetEntry(@event.Entity);
entry.Status = Status.Loaded;
softDeletable.Deleted = true;
Object id = @event.Persister
.GetIdentifier(@event.Entity, @event.Session.EntityMode);
Object [] fields = @event.Persister
.GetPropertyValues(@event.Entity, @event.Session.EntityMode);
Object version = @event.Persister
.GetVersion(@event.Entity, @event.Session.EntityMode);
@event.Persister.Update(id
, fields
, new Int32[1]
, false
, fields
, version
, @event.Entity
, null
, @event.Session.GetSessionImplementation());
return true;
}
}
所以我想知道,false
/ true
实际告诉NHibernate取决于所处理的监听器。
答案 0 :(得分:4)
在这种情况下返回的值应该是 enum ,让我们使用名称OnPreEventResult
,这些将是可能的值:
OnPreEventResult.Continue
=>继续目前返回false
OnPreEventResult.Break
=>目前,当 true
返回时,操作 已中止 因此,正如上面的两个示例所示,我们可以使用返回值来管理执行流程:
继续:
如果我们在AuditEventListener
返回 false ,我们实际上会返回OnPreEventResult.Continue
之类的内容。我们已经制定了一些客户逻辑,我们希望NHibernate继续...所以返回 false
中断/中止:
Ayende的例子告诉我们如何将真正的DELETE更改为UPDATE。由于返回值 true ,即@event.Persister.Update(...
OnPreEventResult.Break
并执行不删除
醇>
在代码中,返回的值存储在名为veto
的局部变量中,这也是更具自描述性的。
请参阅:
EntityInsertAction
,Execute()
方法的摘录:
...
bool veto = PreInsert();
if (!veto)
{
persister.Insert(id, state, instance, Session);
...