C# 如何设计一个好的审计算法?

C# 如何设计一个好的审计算法?,c#,design-patterns,audit-logging,C#,Design Patterns,Audit Logging,我需要做一些审计。我们希望在插入、更新、删除或打开记录时进行存储 目前,我已经在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 }

我需要做一些审计。我们希望在插入、更新、删除或打开记录时进行存储

目前,我已经在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和日期,但我觉得这与注意无关。

你当然应该避免使用singleton(谷歌固有的缺点),但我当然不认为你的方法还有很多其他错误。而且,只有当你发现可读性、性能或正确性等重要因素使你的代码变得更好时,以面向对象的方式或其他方式做一些事情才更明智。OO性其实并不那么重要

因此,为了绕过您的单身汉,每当您执行需要审计的操作时,我都会注入一个审计员的实例:

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

    myAuditer.Audit(...);
}

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

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


根据我的审计经验,我发现保存一份前后图像、更改日期和时间以及更改人的副本非常有用。

在执行CRUD类型的操作时,使用。您可以为您的存储库类创建一个基类来为您处理审计。

这是一个基本的示例。基本上,您有一个横切需求,它将扩展到系统的许多部分(即日志或审计)。问题在于,您的方法似乎是正确的,但可能难以维护,并且无法很好地扩展。如果你有时间并且愿意,你可以阅读并尝试使用,他们有一个免费的入门版。您也可以检查这一点:

我不知道这是否适合您,但在过去,我曾在一些系统上工作过,这些系统使用insert/update/delete触发器对一个表进行审计。\u审计版本的表。哪些RDBMS?审核数据更改实际上属于数据库……他甚至没有提到数据库,为什么要假设其中涉及数据库?据我们所知,这可能是一个Twitter垃圾邮件。虽然您当然可以审计在数据库级别发生的更改,但在数据库级别进行更改时,审计谁做了更改更麻烦。当您有一个web应用程序时,大多数情况下,web应用程序的所有用户都使用单个用户帐户访问数据库,但您真正想要跟踪的是应用程序级别(而不是数据库)的哪个用户进行了更改。除非访问数据库的唯一方法是通过需要传入应用程序用户凭据的存储过程,否则这只能在应用程序级别执行。@糟糕,我们使用的是MS SQL Server 2005和Higher。通过使用这种方法,调用方必须知道操作将被审核。这有意义吗?如果RemoveSomeObject方法在域层中移动(如我所建议的),则返回yes。用户只需调用Remove()方法,然后调用RemoveSomeObject()方法。用户不会知道审核器,但域层会知道。如果您是针对接口编程的,您可以按照装饰器模式根据需要添加审核。