我最近发现了如何在IPreDeleteEventListener
名称空间中使用IPreInsertEventListener
,IPreUpdateEventListener
和NHibernate.Event
审核实例的方法。
但是,仍然使我感到困惑的是,无论这些成功或失败的最终结果,这些事件将返回什么。
例如,让我们来看一下Ayende的博客文章:NHibernate IPreUpdateEventListener & IPreInsertEventListener
按照他的示例,可以实现如下接口:
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
。Soft Deletes With NHibernate
似乎返回
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的是什么,具体取决于所处理的侦听器。 最佳答案
在这种情况下,返回值应该是枚举,让我们使用名称OnPreEventResult
,这些可能是值:OnPreEventResult.Continue
=>继续当前返回false
OnPreEventResult.Break
=>目前,当返回true
时,操作将中止
因此,如以上两个示例所示,我们可以使用返回值来管理执行流程:
接着说:
如果我们在AuditEventListener
中返回false,则实际上返回类似OnPreEventResult.Continue
的内容。我们已经进行了一些自定义逻辑,我们希望NHibernate继续进行...因此返回false
中断/中止:
Ayende的示例向我们展示了如何将实际的DELETE更改为UPDATE。更新被明确地称为@event.Persister.Update(...
,并且由于返回值true(即OnPreEventResult.Break
),因此不执行删除
在代码中,返回的值存储在名为veto
的局部变量中,该变量再次具有自我描述性。
看到:
EntityInsertAction,或
EntityDeleteActionEntityInsertAction
,Execute()
方法的摘录:
...
bool veto = PreInsert();
if (!veto)
{
persister.Insert(id, state, instance, Session);
...