我正在寻找有关如何在C#中为我的对象实现审计跟踪的想法,对于当前项目,基本上我需要:
1.存储给定对象的旧值和新值。 2.记录新对象的创建。 3.删除旧物体。
是否有任何通用的方法,比如使用C#Generics,这样我就不必为基础对象的事件编写代码,如创建,删除等(ORM对象)。事情是这样的如果有一种方法可以注入审计跟踪,如果一个人正在使用a。任何人都有任何经验或他们遵循的任何方法。任何方式在面向方面(AOP)mannner中执行此操作。
请分享您的想法等。
答案 0 :(得分:3)
您可以实现与INotifyPropertyChanged类似的功能,但略有不同。我已经提取了大部分的INotifyPropertyChanged并将其更改为通用并存储新旧值。然后,您可以使用某种管理类来监听这个和onSaving,并且onDeleting您可以处理这些更改。
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; }
}
答案 1 :(得分:1)
问题非常相似 How do you implement audit trail for your objects (Programming)?
我们使用AOP(aspectJ实现)实现了类似的解决方案。可以捕获使用此特定点并执行特定操作。
我们喜欢的时候可以插上电源插上电源。
但是,我们的实现是在J2EE ..
如果您真的想在应用层中执行此操作,我建议您这样做。
希望有所帮助......
答案 2 :(得分:1)
除了上面提到的某些内容之外,Command Pattern可能会有所帮助,如果在命令中包装对象的所有状态更改,那么命令可以负责保持审计跟踪,而对象不必担心审计本身。当然,创建和处理命令会增加额外开销。
您可以在任何现有对象结构周围包装命令,只需将操作委派给命令层,而不是直接在对象上执行操作。
答案 3 :(得分:1)
您是否考虑过使用简单的通知模式?您可以让服务层引发事件,例如NewObject,ChangedObject,DeletedObject,它们将由通用服务层监听,然后可以获取对象并保存结果。
如果要保存对象的状态,可以使用Xml序列化。
如果您使用SQL Server 2008可以实现新的审核功能,则可以使用另一种方法,该功能可以审核数据库记录的更改,您甚至可以在读取数据时跟踪(我认为)。
答案 4 :(得分:0)
相当古老的问题,但对于那些想要审核C#对象的人,我会推荐Audit.NET库。
它具有登录到不同存储系统(SQL,Azure,Mongo)和审核不同系统(WCF,EF,MVC)的扩展。
注意:我是主人