我目前正在开发ASP.NET人力资源系统。我正在使用基于MVP模式的Web客户端软件工厂的分层架构。 ORM是NHibernate。我需要实现一个审计日志模块。我已经阅读了很多关于不同方法的内容。他们中的大多数描述了如何跟踪进行更改的人的日期,timastamp和身份,但是没有人可以告诉我这个:如何跟踪我的Domain层中任何属性的更改?我不需要任何回滚功能,我只需要记录:谁,何时和什么对象的属性被更改,旧值和该属性的新值。
我无法决定将此更改的处理程序放在何处。 Fowler指出了审核日志的setter属性方法,但我仍然希望保持我的域类简单的POCO。也许还有其他方法吗?
答案 0 :(得分:2)
以下是我修剪过的模板示例:
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;
}
}
使审计变得容易的有趣部分是每个对象都可以生成自己的审计日志。我可以接受任何可能包含x个这些'字段'的对象,并在其上调用GetAudit,它会返回一个审计对象,其中对类的所有更改显示字段名称,旧val,新val等。 'DataField'将实现一个返回审计对象的方法。对于字符串,double,ints等,它几乎已经完成,但如果您使用自定义对象,则可以为它们编写审计实现,只需返回Audit对象。
因此,在最后的典型形式中,我将所有数据存储在一个具有所有这些类型字段的对象中。然后我会进行更新并调用GetAudit方法,该方法也会写入审计表。
即使他们不得不浏览多个页面等,我也可以轻松判断表格中是否有任何变化。
逐字段,逐段或整个对象级别的撤销非常简单。
由于我没有在很长一段时间内触及代码,但确切的细节上有点模糊,但这就是它的要点。希望有所帮助。答案 1 :(得分:0)
也许你可以实现观察者模式,但是,因为.net隐式地(使用事件)实现这种模式,我认为不会有太多的附加价值。
也许您可以保存“原始”对象并在时间合适时(可能使用反射)将它们与修改后的对象进行比较,并找出哪些属性已更改以及它们的新值是什么。 但请注意,您无法在.net中创建对象的深度复制(除非您可以序列化对象),因此请牢记此解决方案
答案 2 :(得分:0)
您需要在对象中保留原始数据,或者在更新之前从数据库中提取数据以进行记录。
我已经看到这在数据层中实现,无论是在存储过程还是触发器中,但从未在域层中实现。
编辑:在这里可以找到使用数据库触发器记录历史记录的2部分示例:http://www.4guysfromrolla.com/webtech/041807-1.shtml关于此技术的优点/缺点似乎有很多很好的讨论。我希望有所帮助。
答案 3 :(得分:-1)
您是否签出了Microsoft企业库的Logging Application Block?