Audit.Net - 不同类型的对象 - 如何使通用?

Audit.Net - different types of objects - how to make generic?

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

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

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

目前,我将通过 MVC / Web API 控制器传递的对象设置为 AuditEvent 的目标(使用 Audit.MVC 版本 14.2.1)。

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

我已经扩展了 AuditDataProvider 并且需要将 Target 对象(在本例中为 LeaveRequest)的每个 属性 添加到 table。 因此,在我的 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?)

我也考虑过使用 Action Parameters,但是每个对象都需要充实其 ToString(这可能需要大量的手动工作加上字符串操作来获取属性),但它并没有感觉很整洁。

所以我不知道这个问题是否更像是一个普通的泛型问题,而不是 Audit.Net 问题,但我认为 Audit.Net 上下文很重要,也许在每个问题中设置对象作为目标的情况不是一个好主意。 我很想知道其他人如何使用 Audit.Net 来审核需要相同输出方式的不同类型的对象。

如果您不关心 "old" 值,请不要使用 Target 对象,而是使用 Custom Field,这样可以避免不必要的 serialization/deserialization.

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

对于只有三种类型的对象,您可能不需要有一个通用的解决方案,这意味着需要进行更多测试等...