在C#中实现对象审计跟踪?

7
我正在寻找如何在C#中为我的对象实现审计跟踪的想法,对于当前项目,我需要做到以下几点:
  1. 存储给定对象的旧值和新值。
  2. 记录新对象的创建。
  3. 删除旧对象。
是否有通用的方法来实现这一点,比如使用C#泛型,以便我不必为基本对象的事件编写代码,例如在创建、删除等方面。(ORM对象)。如果有一种方法可以在使用 .NET 的情况下注入审计跟踪,那就太棒了。是否有任何经验或任何方法可以遵循。是否有任何在面向方面 (AOP) 方式下完成此任务的方式。
请分享您的想法等。
5个回答

3
你可以实现类似于INotifyPropertyChanged的东西,只是稍有不同。我已经提取了大部分的INotifyPropertyChanged,并将其更改为通用的并存储新旧值。然后你可以有一些管理类来监听这个,在保存和删除时处理更改。
public interface INotifyProperyChanged<T>
{
   event PropertyChangedEventHandler<T> PropertyChanged;
}

    public delegate void PropertyChangedEventHandler<T>(object sender,   
PropertyChangedEventArgs<T> e);

public class PropertyChangedEventArgs<T> : EventArgs
{
    private readonly string propertyName;

    public PropertyChangedEventArgs(string propertyName)
    {
        this.propertyName = propertyName
    }

    public virtual string PropertyName { get { return propertyName; } }

    public T OldValue { get; set; }
    public T NewValue { get; set; }
}

2

您是否考虑使用简单的通知模式?您可以让服务层引发事件,例如NewObject,ChangedObject和DeletedObject,这些事件将被一般性服务层侦听,然后可以获取对象并保存结果。

如果您想保存对象的状态,则可以利用Xml Serialization。

如果您使用SQL Server 2008,则可以实现新的审计功能,该功能将允许您审计对数据库记录的更改,甚至可以跟踪(我认为)数据何时被读取。


1

问题与如何为对象(编程)实现审计跟踪?相似。

我们使用AOP(aspectJ实现)实施了类似的解决方案。使用特定的点可以捕获并执行特定的操作。

这可以在需要时插入和拔出。

但是,我们的实现是在J2EE中进行的。

如果您真的想在应用程序层面上做到这一点,我建议您尝试以下方法。

希望这有所帮助。


我问了这个问题,为什么它在这里很相似... 好吧,我有城堡作为我的AOP,但我如何进行拦截等操作,或者是否有任何模式我必须遵循,或者您能用言语表达您是如何做到的吗?希望这不是太多。 - abmv
我们使用了Spring IOC和Spring AOP。它们提供了静态和动态AOP。你需要将切面编写为bean,然后将它们附加到要审计的对象上。我想.NET的等效物称为NSpring。 - Satya

1
除了上面提到的一些事情之外,命令模式可能会有所帮助,如果您将对象上的所有状态更改都包装在一个命令中,那么命令可以负责保持审计跟踪,而对象则不必担心自己的审计。当然,创建和处理命令会增加额外的开销。
您可以将命令包装在任何现有的对象结构中,只需将操作委托给命令层,而不是直接在对象上执行它们。

0

这是一个比较老的问题,但对于那些想要审计 C# 对象的人,我推荐使用 Audit.NET 库。

它有扩展功能,可以记录到不同的存储系统(SQL、Azure、Mongo),并且可以审计不同的系统(WCF、EF、MVC)。

注意:我是该库的所有者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接