Audit.Net - различные типы объектов - как сделать общий? - PullRequest
2 голосов
/ 08 мая 2019

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

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

Существуют различные типы объектов, которые необходимо проверять, но в базе данных уже есть фиксированная таблица (из другой части системы), в которую должны попадать проверенные данные.

В настоящее время я устанавливаю объект, который передается через контроллер MVC / Web API в качестве цели AuditEvent (с использованием Audit.MVC версии 14.2.1).

this.GetCurrentAuditScope().SetTargetGetter(() => leaveRequest);

Я расширил AuditDataProvider и мне нужно добавитькаждое свойство объекта Target (в данном случае LeaveRequest) для таблицы.Так что в моем SQLAuditDataProvider я получаю новые значения LeaveRequest, перебираю его свойства и записываю каждое ненулевое значение в базу данных.oldvalue с LeaveRequest не имеет значения.Вот пример:

if (auditEvent.Target.Type == "LeaveRequest")
{
    LeaveRequest leaveReq = JsonConvert.DeserializeObject<LeaveRequest>(auditEvent.Target.SerializedNew.ToString());                       

    foreach (var property in leaveReq.GetType().GetProperties().Where(property => !property.GetGetMethod().GetParameters().Any()))
    {
        if (property.GetValue(leaveReq) != null)
        {
            var sqlResult = context.sp_ESS_InsertResourceAudit(leaveReq.ResourceTag, dbObjectName, username, property.Name, oldValue,property.GetValue(leaveReq).ToString(), auditEvent.StartDate, auditControlTableID.ToString(),auditEvent.Environment.CallingMethodName);
        }
    }

}

Но, конечно, это работает только с LeaveRequest.Таким образом, появляется любой другой объект, который установлен как Цель AuditEvent, и у меня есть проблема.Как сделать вышеупомянутый код универсальным, чтобы он мог обрабатывать любой объект (и даже int?)

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

Так что я не знаю, является ли этот вопрос более простым обобщениемодин, чем один Audit.Net, но я думаю, что контекст Audit.Net важен, и, возможно, установка объекта в каждом случае как цели не является хорошей идеей.Мне было бы интересно узнать, как другие люди используют Audit.Net для аудита различных типов объектов, которым требуется одинаковый способ вывода.

1 Ответ

0 голосов
/ 08 мая 2019

Если вас не волнует «старое» значение, не используйте целевой объект, вместо этого используйте Настраиваемое поле , чтобы избежать ненужной сериализации / десериализации.

this.GetCurrentAuditScope().SetCustomField("LeaveRequest", leaveRequest);

Итак, по вашему провайдеру данных:

if (auditEvent.CustomFields.ContainsKey("LeaveRequest"))
{
    var leaveReq = auditEvent.CustomFields["LeaveRequest"] as LeaveRequest;
    InsertLeaveRequest(leaveReq);
}
if (auditEvent.CustomFields.ContainsKey("AnotherField"))
{
    var another = auditEvent.CustomFields["AnotherField"] as AnotherType;
    InsertAnotherType(another);
}
...

Только для трех типов объектов вам, вероятно, не нужно иметь универсальное решение, которое потребует дополнительного тестирования и т. Д. *

...