【问题标题】:Audit.Net - different types of objects - how to make generic?Audit.Net - 不同类型的对象 - 如何使通用?
【发布时间】: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 来审核需要相同输出方式的不同类型的对象。

【问题讨论】:

    标签: c# audit.net


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的快速回复。我认为在某些情况下我会需要 oldValue,但我与另一个在系统上工作的程序员进行了核对,似乎不需要。好吧,我可以使用 CustomField 而不是 Target。但是,不会只有三种对象,可能超过十种,但希望不超过三十种。所以我正在考虑一个更通用的解决方案。我也想知道对于将来接替我的人来说,什么最容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多