首页 > 解决方案 > Audit.Net - 不同类型的对象 - 如何使通用?

问题描述

我正在使用 Audit.Net(这是一个出色的实用程序)来开始审核一个在设计时并未考虑到审核的系统。在这种情况下,Audit.Net 是救命稻草。

我想一定有人遇到过类似的情况,我问这个问题是因为我觉得我没有走最好的路线。

有不同类型的对象需要审计,但数据库中已经有一个固定的表(来自系统的另一部分),审计数据必须进入该表。

目前,我将通过MVC / Web APIController 传递的对象设置为 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 来审核需要相同输出方式的不同类型的对象。

标签: c#audit.net

解决方案


如果您不关心“旧”值,请不要使用 Target 对象,而是使用自定义字段,这样可以避免不必要的序列化/反序列化。

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);
}
...

对于仅三种类型的对象,您可能不需要具有意味着更多测试等的通用解决方案......


推荐阅读