Я использую 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 для аудита различных типов объектов, которым требуется одинаковый способ вывода.