如何使用 Audit.Net 扩展 Audit.Mvc 设置 AuditEvent 的目标对象

How to set Target object of AuditEvent using Audit.Net extension Audit.Mvc

我必须将审计添加到我没有编写代码的系统中,并且在编程时也没有考虑过审计。

然后我遇到了 Audit.Net,多么棒的框架!

我也在使用 Audit.Mvc 扩展程序。

无论如何,我想在 HomeController 中添加一个 Target 对象到 AuditEvent 对象。我有这个:

[Audit]
public ActionResult CreateLeavePrerequest(LeaveRequest leaveRequest)
{...
var auditScope = this.GetCurrentAuditScope();
...
}

如何将 leaveRequest 作为目标添加到 auditScope 的 AuditEvent?

在当前版本中,Target 对象只能在 AuditScope 创建时分配,使用 Audit.Mvc 扩展时您无法控制。

当然你可以像这样手动:

[Audit]
public ActionResult CreateLeavePrerequest(LeaveRequest leaveRequest)
{
    SetTargetObject(leaveRequest);

    // ... I guess here the leaveRequest object is modified
    leaveRequest.SomeProp = "NewValue";

    UpdateTargetObject(leaveRequest);
}

private void SetTargetObject(object value)
{
    var scope = this.GetCurrentAuditScope();
    scope.Event.Target = new AuditTarget
    {
        SerializedOld = scope.DataProvider.Serialize(value),
        Type = value.GetType().Name
    };
}

private void UpdateTargetObject(object value)
{
    var scope = this.GetCurrentAuditScope();
    scope.Event.Target.SerializedNew = scope.DataProvider.Serialize(value);
}

我会在下一个版本的库中提供重新分配 Target Getter 的方法(真的很快),这样可以简化这种用例。

但是如果你只需要一个版本的 leaveRequest 对象,你可以只使用 Custom Field:

[Audit]
public ActionResult CreateLeavePrerequest(LeaveRequest leaveRequest)
{
    this.GetCurrentAuditScope().SetCustomField("LeaveRequest", leaveRequest);

    // ...

}

更新

从版本 14.2.1 开始,该库在 AuditScope 上公开了一个 SetTargetGetter(Func<object>) 方法来更新目标 getter(一个 returns 目标对象的函数审计)。

所以第一个例子现在可以简化为:

[Audit]
public ActionResult CreateLeavePrerequest(LeaveRequest leaveRequest)
{
    this.GetCurrentAuditScope().SetTargetGetter(() => leaveRequest);

    // ... 
    leaveRequest.SomeProp = "NewValue";
}