【问题标题】:hint for audit log approach审计日志方法的提示
【发布时间】:2010-11-05 15:40:00
【问题描述】:

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

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

【问题讨论】:

  • 你已经考虑过AOP了吗?

标签: .net asp.net nhibernate design-patterns audit


【解决方案1】:

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

这是我剪裁下来的模板示例:

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' 将实现一个返回审计对象的方法。对于字符串、双精度、整数等,它几乎已经融入其中,但如果您使用自定义对象,您可以为它们编写审计实现,只需返回一个审计对象。

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

即使他们必须浏览多个页面等,我也可以轻松判断表单中是否有任何更改。

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

由于我很长时间没有接触过代码,所以对具体细节有点模糊,但这就是它的要点。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    也许你可以实现观察者模式,但是,由于 .net 隐式地​​(通过事件)实现了这种模式,我认为不会有太多的附加值。

    也许您可以保存“原始”对象并在适当的时候将它们与修改后的对象进行比较(也许使用反射),并找出哪些属性已更改以及它们的新值是什么。 但是,请注意,您不能在 .net 中对对象进行深度复制(除非您可以序列化对象),因此请记住此解决方案

    【讨论】:

      【解决方案3】:

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

      我已经在数据层看到了这一点,无论是在存储过程还是触发器中,但从未在域层中实现。

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

      【讨论】:

      • 好吧,也许我想要的太多了,但你能分享一些代码或图表,说明这种方法,无论是在数据层还是服务层......我只是无法想象这样的审计系统...
      【解决方案4】:

      您查看过 Microsoft Enterprise Library 的 Logging Application Block 吗?

      【讨论】:

        猜你喜欢
        • 2018-12-30
        • 2018-04-26
        • 2018-01-25
        • 2010-10-16
        • 2012-08-31
        • 2011-10-24
        • 2020-05-04
        • 2020-04-13
        • 2011-08-05
        相关资源
        最近更新 更多