对于IPreInsertEventListeners,false / true真正意味着什么?

时间:2014-02-17 20:34:01

标签: nhibernate audit

我最近发现了如何使用IPreDeleteEventListener命名空间中的IPreInsertEventListenerIPreUpdateEventListenerNHibernate.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;
    }
}

truefalse作为返回值返回实际意味着什么颂歌,因为我有另一个例子,其中返回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取决于所处理的监听器。

1 个答案:

答案 0 :(得分:4)

在这种情况下返回的值应该是 enum ,让我们使用名称OnPreEventResult,这些将是可能的值:

  • OnPreEventResult.Continue =>继续目前返回false
  • OnPreEventResult.Break =>目前,当 true 返回时,操作 已中止

因此,正如上面的两个示例所示,我们可以使用返回值来管理执行流程:

  1. 继续
    如果我们在AuditEventListener返回 false ,我们实际上会返回OnPreEventResult.Continue之类的内容。我们已经制定了一些客户逻辑,我们希望NHibernate继续...所以返回 false

  2. 中断/中止
    Ayende的例子告诉我们如何将真正的DELETE更改为UPDATE。由于返回值 true ,即@event.Persister.Update(...

  3. ,系统会明确调用更新OnPreEventResult.Break并执行删除

    在代码中,返回的值存储在名为veto的局部变量中,这也是更具自描述性的。

    请参阅:

    EntityInsertActionExecute()方法的摘录:

    ...
    bool veto = PreInsert();
    
    if (!veto)
    {    
        persister.Insert(id, state, instance, Session);
    ...