2009-06-24 58 views
3

我目前正在开发一个ASP.NET人力资源系统。我正在使用基于MVP模式的Web客户端软件工厂的分层架构。 ORM是NHibernate。我需要实施审计日志模块。我读了很多关于不同的方法。他们中的大多数描述了如何跟踪日期,时间戳和做出该更改的人员的身份,但没有人能告诉我有关此问题的一个方法:如何跟踪我的域图层中任何属性的更改?我不需要任何回滚功能,我只需要登录:什么对象的谁,何时和什么属性被更改,该属性的旧值和新值。提示审核日志方法

我不能决定把这个改变的处理程序放在哪里。福勒指出审计日志属性的setter方法,但我仍然想让我的域类简单POCO的。也许还有其他方法?

+0

你认为AOP已经? – Paco 2009-06-24 21:19:09

回答

2

我不得不在几年前为HR系统做这个。我完成有我所有的“域”实现的模板(通用)是:

这里是我做了下调模板的一个例子:

class DataField<T> 
{ 
    public T Current { get; set; } 
    public T Original { get; set; } 
    // stores the field name as a nice textual readable representation. 
    // would default to property name if not defined. 
    public string FieldName { get; set; } 
    public bool Modified 
    { 
     get { return !(Current.Equals(Original)); 
    } 

    public DataField(T value) 
    { 
     Original = Current = value; 
    } 

    public DataField(T value, T fieldName) 
    { 
     Original = Current = value; 
     FieldName = fieldName; 
    } 
} 

关于它的有趣的部分是由auditting方便的是,每个对象都可以生成它自己的审计日志。我可以接受任何可能包含x个这些'字段'的对象,然后调用GetAudit,它将返回一个审计对象,其中包含显示字段名称,旧val,新val等的所有更改。每个'DataField'将实现一个返回审计对象的方法。对于字符串,双精度,整数等,它几乎已经被烘焙了,但是如果你使用了自定义对象,你可以为它们编写审计实现,只需要返回一个审计对象。

因此,在最后的典型形式中,我将所有数据存储在一个具有所有这些类型字段的对象中。然后我会进行更新并调用GetAudit方法,该方法也将写入审计表。

我可以很容易地分辨什么形式发生了变化,即使他们不得不通过多个页面等

撤消的是在逐个字段,逐节或整个对象级别真的很容易,以及。

对于确切的细节我几乎没有触及代码,但这是它的要点。希望有所帮助。

0

也许你可以实现观察者模式,但是,因为.net隐式实现这个模式(有事件),我认为不会有太多的附加价值。

也许你可以保存“原始”objetcs,并在时间正确的时候(可能使用反射)将它们与修改后的对象进行比较,找出哪些属性发生了变化,以及它们的新值是什么。 但是,请注意,您无法在.net中制作对象的深度复制(除非您可以序列化对象),请记住该解决方案

0

您需要将原始数据保留在对象中,或者将其从数据库中提取以便在更新之前进行日志记录。

我已经看到这在数据层实现,无论是在存储过程或触发器,但从来没有在域层。

编辑:使用数据库触发器记录历史记录的2部分示例在这里找到:http://www.4guysfromrolla.com/webtech/041807-1.shtml似乎有很多关于这种技术的优点/缺点的良好讨论。我希望有所帮助。

+0

好的,也许我想要的太多了,但是你能分享一些代码或者diagramm,它们可以在数据层或者服务层上说明这种方法......我只是无法想象这样的审计系统...... – Alkersan 2009-06-25 11:59:08