2012-02-03 51 views
2

我需要执行某种审计。我们希望在记录插入,更新,删除或打开时进行存储。如何设计一个好的审计算法?

现在我已经创建了一个简单的方法在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) 
} 

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

我认为做更多的面向对象的方式会更聪明,您怎么看? 编辑:

我做日志的用户名和日期,但我没有发现它相关的通知。

+1

我不知道这是否是一个选项,但在过去,我一直在使用插入/更新/删除触发器对*表进行审计的系统* _audit版本的表格。 – asawyer 2012-02-03 13:41:57

+1

哪个RDBMS?审计数据变化*真的*属于数据库... – Yuck 2012-02-03 13:42:19

+0

他甚至没有提到一个数据库,为什么假设有一个数据库?这可能是我们所知道的一个Twitter spambot。 – Aidan 2012-02-03 13:46:28

回答

1

那么你当然应该避免单身人士(谷歌因其固有的邪恶),但我当然不认为你的方法有太多的错误。而且,以OO方式做某些事情会更聪明,否则,如果它使得您的代码更好,而不是像可读性,性能或正确性那样重要的因素。面向对象并不是那么重要。

因此,要获得圆你单身,只要你做到这一点,需要审计的操作我会注入你的审计员的一个实例:

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

    myAuditer.Audit(...); 
} 

(顺便说一句,你或许应该采取删除逻辑您的形式作为好吧,并把它放在另一层 - 每个类应该只有一个责任)

+0

通过使用这种方法,调用者必须知道该行为将被审计。这有道理吗? – Martijn 2012-02-03 13:53:52

+0

如果在域图层中移动RemoveSomeObject方法(如我所建议的那样),那么是的。用户只需调用Remove()方法,然后调用RemoveSomeObject()方法。用户不会知道审核员,但域层会。 – Aidan 2012-02-03 14:13:36

+0

如果您使用接口进行编程,则可以按照装饰器模式根据需要添加审核。 – 2013-04-03 19:00:52

0

我会建议在您的数据层尽可能最低级别审计,以减少方法调用您的审计对象的数量。

从我的审计经验来看,我发现保留前后图像的副本,更改日期和时间以及更改人员是很有用的。

2

在执行CRUD类型动作时,通常使用Repository Design Pattern封装数据访问层是很好的做法。你可以为你的Repository类设置一个基类来处理你的审计。

+0

我们正在与工作单位和存储库合作 – Martijn 2012-02-03 13:55:23

1

这是Aspect-oriented programming的一个关键例子。基本上你有一个横切的要求,将传播到系统的许多部分(即日志或审计)。问题是你的方法似乎是正确的,但可能很难维护,并且不能很好地扩展。如果你有时间和想要的话,你可以阅读关于这个问题,并试用PostSharp,他们有一个免费的入门版。你也可以检查这个:AOP in .NET