【问题标题】:How to design a good auditing algorithm?如何设计一个好的审计算法?
【发布时间】:2012-02-26 02:57:06
【问题描述】:

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

现在我已经在 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 和日期,但我发现它与通知无关。

【问题讨论】:

  • 我不知道这是否适合您,但过去我曾研究过使用插入/更新/删除触发器对 table进行审计的系统>_审计表的版本。
  • 哪个 RDBMS?审核数据更改真的属于数据库...
  • 他甚至没有提到数据库,为什么要假设涉及数据库?据我们所知,它可能是 Twitter 垃圾邮件机器人。
  • 虽然您当然可以审核在数据库级别发生了哪些更改,但在数据库级别进行更改时审核谁进行了更改则更加麻烦。当您拥有一个 Web 应用程序时,大多数情况下,该 Web 应用程序的所有用户都在一个用户帐户下访问数据库,但您真正想要跟踪的是应用程序级别(而不是数据库)的哪个用户进行了更改。除非访问数据库的唯一方法是通过需要传递应用程序用户凭据的存储过程,否则这只能在应用程序级别完成。
  • @Yuck 我们使用的是 MS SQL Server 2005 及更高版本

标签: c# design-patterns audit-logging


【解决方案1】:

在执行 CRUD 类型的操作时,最好使用 Repository Design Pattern 封装数据访问层。你可以为你的 Repository 类创建一个基类来为你处理审计。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      private void RemoveSomeObject(SomeObject myObject, Auditer myAuditer)
      {
          // do stuff //
      
          myAuditer.Audit(...);
      }
      

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

      【讨论】:

      • 通过使用这种方法,调用者必须知道该操作将被审计。这有意义吗?
      • 如果 RemoveSomeObject 方法在域层中移动(如我所建议的那样),是的。用户只需调用 Remove() 方法,然后调用 RemoveSomeObject() 方法。用户不会知道 Auditer,但域层会。
      • 如果您正在针对接口进行编程,您可以按照装饰器模式根据需要添加审核。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-08-25
        • 2010-10-17
        • 1970-01-01
        • 2013-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多