.net - 审计日志方法的提示

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

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

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

最佳答案

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

这是我修剪的模板示例:

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

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

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

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

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

关于.net - 审计日志方法的提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1040626/

相关文章:

c# - ASP.NET SQL 插入错误

c# - 让 2 个不同的映射文件在同一个域中工作

nhibernate - 我在这个模型中打破了我的聚合边界吗?

c# - 在不知道 T 的情况下将泛型类型指定为参数参数

c# - 为我自己的类型在 byte[] 上实现 Linq 查询

.net - 将用户添加到 Active Directory 中的安全组

javascript - 防止在移动设备回发时调整大小

c# - 关于在 .NET 中保存位图的问题

asp.net - 使用后如何处理数据上下文

c# - 强制 Orchard 存储库插入数据