Как установить целевой объект AuditEvent с помощью расширения Audit.Net Audit.Mvc - PullRequest
3 голосов
/ 05 апреля 2019

Я должен добавить аудит в систему, которую я не кодировал и которая не была запрограммирована ни на какие мысли для аудита.

Затем я наткнулся на Audit.Net, и что за потрясающая среда!

Я также использую расширение Audit.Mvc.

В любом случае, я хочу добавить объект Target в HomeController к объекту AuditEvent.У меня есть это:

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

Как добавить запрос на отпуск в качестве Цели для AuditEvent audScope?

1 Ответ

1 голос
/ 05 апреля 2019

В текущей версии объект 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);
}

Я предоставлю способ переназначения Получателя цели в следующей версии библиотеки (очень скоро), так что этот вид использования может быть упрощен.

Но если вам нужна только одна версия объекта leaveRequest, вы можете просто использовать Настраиваемое поле :

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

    // ...

}

Обновление

Запускв версии 14.2.1 библиотека предоставляет метод SetTargetGetter(Func<object>) для AuditScope для обновления целевого метода получения (функция, которая возвращает целевой объект для аудита).

Так что первый пример теперь можно упроститькак:

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

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