【发布时间】:2019-05-09 01:51:42
【问题描述】:
我正在使用 Audit.Net(这是一个出色的实用程序)来开始审核一个在设计时并未考虑到审核的系统。在这种情况下,Audit.Net 是救命稻草。
我想肯定有人遇到过类似的情况,我问这个问题是因为我觉得我没有走上最好的路线。
有不同类型的对象需要审计,但数据库中已经有一个固定的表(来自系统的另一部分),审计数据必须进入该表。
目前,我将通过MVC / Web APIController 传递的对象设置为 AuditEvent 的目标(使用 Audit.MVC 版本 14.2.1)。
this.GetCurrentAuditScope().SetTargetGetter(() => leaveRequest);
我扩展了AuditDataProvider 并且需要将Target 对象(在本例中为LeaveRequest)的每个属性添加到表中。
因此,在我的SQLAuditDataProvider 中,我获得了 LeaveRequest 的新值,并遍历其属性并将每个非空值写入数据库。带有 LeaveRequest 的 oldvalue 并不重要。这是一个例子:
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 上下文很重要,也许在每种情况下都将对象设置为 Target 不是一个好主意。 我很想知道其他人如何使用 Audit.Net 来审核需要相同输出方式的不同类型的对象。
【问题讨论】: