3

我需要进行某种审计。我们希望存储插入、更新、删除或打开记录的时间。

现在我已经在 Singleton 类上创建了一个简单的方法:

public void Audit(string audit, AuditTypes type)
{
    AuditEntry = new AuditEntry(){ Audit = audit, TypeId = (int)type };

    // some logic to commit the audit entry to the database
}

public enum AuditTypes
{
  Insert = 1,
  Update = 2,
  Delete = 3
  Open = 4
}

在表格中的某处我称之为这种方法:

MyForm.cs:

private void RemoveSomeObject(SomeObject myObject)
{
   /* Do some stuff that removes the object*/

   MySingleton.GetInstance().Audit(myObject.Title, AuditTypes.Delete)
}

出于某种原因,我不认为这是要走的路,因为在代码中的任何地方都使用这种方法我有这种行。

我认为以更面向对象的方式来做更聪明,你觉得呢?编辑:

我确实记录了用户 ID 和日期,但我发现它与通知无关。

4

4 回答 4

2

在执行 CRUD 类型的操作时,最好使用存储库设计模式封装数据访问层。您可以为您的存储库类创建一个基类来为您处理审计。

于 2012-02-03T13:51:46.857 回答
2

这是面向方面编程的经典示例。基本上,您有一个横切需求,它将扩展到系统的许多部分(即日志记录或审计)。问题是您的方法似乎是正确的,但可能难以维护并且不能很好地扩展。如果您有时间并且愿意,可以阅读此内容并使用PostSharp尝试一下,他们有一个免费的入门版。您还可以检查:AOP in .NET

于 2012-02-03T14:25:20.050 回答
1

那么你当然应该避免单例(谷歌因为它固有的邪恶),但我当然不认为你的方法有很多其他错误。只有以 OO 方式或其他方式做某事才会更聪明,如果它能让您针对某些您认为重要的因素(如可读性、性能或正确性)更好地编写代码。OO 并不是那么重要。

因此,为了绕过您的单身人士,每当您执行需要审核的操作时,我都会注入您的 Auditor 实例:

private void RemoveSomeObject(SomeObject myObject, Auditer myAuditer)
{
    // do stuff //

    myAuditer.Audit(...);
}

(顺便说一句,您可能也应该将删除逻辑从您的表单中取出,并将其放在另一层 - 每个类应该只有一个责任)

于 2012-02-03T13:44:34.420 回答
0

我建议在您的数据层中尽可能进行最低级别的审核,以减少对您的审核员对象的方法调用次数。

根据我的审计经验,我发现保留之前和之后图像的副本、更改的日期和时间以及进行更改的人员很有用。

于 2012-02-03T13:48:30.343 回答