c# - Audit.Net - 不同类型的对象 - 如何使通用?
问题描述
我正在使用 Audit.Net(这是一个出色的实用程序)来开始审核一个在设计时并未考虑到审核的系统。在这种情况下,Audit.Net 是救命稻草。
我想一定有人遇到过类似的情况,我问这个问题是因为我觉得我没有走最好的路线。
有不同类型的对象需要审计,但数据库中已经有一个固定的表(来自系统的另一部分),审计数据必须进入该表。
目前,我将通过MVC / Web API
Controller 传递的对象设置为 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 来审核需要相同输出方式的不同类型的对象。
解决方案
如果您不关心“旧”值,请不要使用 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);
}
...
对于仅三种类型的对象,您可能不需要具有意味着更多测试等的通用解决方案......
推荐阅读
- wordpress - 每个订单一个类别 Wocomerce
- python - 使用 python 解释性能结果的好方法是什么?
- hyperledger-fabric - 部署链码时内存不足
- influxdb - 如何在通量查询中的正则表达式条件内转义正斜杠“/”
- javascript - 在浏览器中为节拍器准确计时声音
- python - 如何在 Networkx 和 matplotlib 中标记多图的边缘?
- popover - 如何给 ngbpopover 边框
- python - 蟒蛇协助
- python - Python 3 比较列表变量
- typescript - 如何在 GraphQL 的解析器中获取输入类型的数组