gpt4 book ai didi

nhibernate - 对于 IPreInsertEventListeners,false/true 的真正含义是什么?

转载 作者:行者123 更新时间:2023-12-04 01:24:10 28 4
gpt4 key购买 nike

我最近发现了如何使用 NHibernate.Event IPreDeleteEventListenerIPreInsertEventListenerIPreUpdateEventListener 来审计实例。命名空间。

然而,它仍然让我感到困惑,这些事件在成功或不成功的最终结果中应该返回什么。

例如,让我们看一下此处找到的 Ayende 的博客文章:

按照他的例子,可以实现如下接口(interface):

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 而不是false 正如 Ayende 所写。

它似乎返回 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 什么。

最佳答案

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

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

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

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

  2. 中断/中止:
    Ayende 的示例向我们展示了如何将真正的 DELETE 更改为 UPDATE。更新被显式调用 @event.Persister.Update(... 并且由于返回值 true 而删除执行,即 OnPreEventResult.Break

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

参见:

EntityInsertAction 的片段,Execute() 方法:

...
bool veto = PreInsert();

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

关于nhibernate - 对于 IPreInsertEventListeners,false/true 的真正含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21838758/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com