.net 审核日志方法提示

.net 审核日志方法提示,.net,asp.net,nhibernate,design-patterns,audit,.net,Asp.net,Nhibernate,Design Patterns,Audit,我目前正在开发一个ASP.NET人力资源系统。我正在使用基于MVP模式的Web客户端软件工厂的分层体系结构。ORM是无纤维的。我需要实现一个审计日志模块。我读过很多关于不同方法的书。其中大多数描述了如何跟踪日期、timastamp和做出更改的人的身份,但没有人能告诉我关于这一点:如何跟踪我的域层中任何属性的更改?我不需要任何回滚功能,我只需要记录:对象的谁、何时和什么属性被更改,该属性的旧值和新值 我无法决定将此更改的处理程序放在何处。Fowler在属性的setter方法中指出了一个审计日志,但

我目前正在开发一个ASP.NET人力资源系统。我正在使用基于MVP模式的Web客户端软件工厂的分层体系结构。ORM是无纤维的。我需要实现一个审计日志模块。我读过很多关于不同方法的书。其中大多数描述了如何跟踪日期、timastamp和做出更改的人的身份,但没有人能告诉我关于这一点:如何跟踪我的域层中任何属性的更改?我不需要任何回滚功能,我只需要记录:对象的谁、何时和什么属性被更改,该属性的旧值和新值


我无法决定将此更改的处理程序放在何处。Fowler在属性的setter方法中指出了一个审计日志,但我仍然希望使我的域类保持简单的POCO。也许还有其他方法?

也许您可以实现observer模式,但是,由于.net隐式地(通过事件)实现了此模式,因此我认为不会有太多附加值

也许您可以保存“原始”对象,并在时间合适时将其与修改后的对象进行比较(可能使用反射),找出哪些属性已更改,以及它们的新值。
但是,请注意,您无法在.net中创建对象的深度副本(除非您可以序列化对象),因此请记住,对于此解决方案,您是否签出了Microsoft Enterprise Library的?

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

我在数据层中见过这种实现,无论是在存储过程中还是在触发器中,但从未在域层中见过


编辑:这里有一个使用数据库触发器记录历史的两部分示例:关于这种技术的优缺点,似乎有很多很好的讨论。我希望这能有所帮助。

几年前,我在人力资源系统中也不得不这样做。我让我所有的“字段”实现了一个模板(通用):

下面是我制作的模板的一个示例:

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;
    }
}
类数据字段
{
公共T当前{get;set;}
公共T原始{get;set;}
//将字段名存储为良好的文本可读表示形式。
//如果未定义,将默认为属性名称。
公共字符串字段名{get;set;}
公共布尔修正
{
获取{return!(Current.Equals(Original));
}
公共数据字段(T值)
{
原始=当前=值;
}
公共数据字段(T值,T字段名)
{
原始=当前=值;
FieldName=FieldName;
}
}
使审核变得容易的有趣之处在于,每个对象都可以生成自己的审核日志。我可以获取任何可能有x个“字段”的对象,并对其调用GetAudit,它将返回一个审核对象,该对象包含对类的所有更改,显示字段名、旧值、新值等。每个“DataField”都uld实现一个返回审计对象的方法。对于字符串、double、int等,它基本上是预处理的,但如果使用自定义对象,则可以为它们编写审计实现,只需返回审计对象即可

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

我可以很容易地判断出表格中是否有任何变化,即使他们需要翻阅多页等等

撤消在一个字段一个字段、一个部分一个部分或整个对象级别上都非常容易


虽然我很久没有接触过代码了,但是细节却有点模糊。希望能有所帮助。

你考虑过AOP了吗?好吧,也许我想要的太多了,但是你可以分享一些代码,或者DigaRAMM,它在数据层或服务层中说明了这种方法……我无法想象这样的审计系统…