【发布时间】:2011-04-18 21:22:08
【问题描述】:
我的应用程序中有多个业务对象(C#、Winforms、WinXP)。当用户在 UI 上执行某些操作时,这些对象中的每一个都会被应用程序的不同部分修改和更新。每次修改后,我需要首先检查发生了什么变化,然后记录对对象所做的这些更改。记录此内容的目的是创建对应用程序中正在进行的活动的全面跟踪。
这些对象中的许多都包含其他对象的列表,并且这种嵌套可以有好几层。任何解决方案的两个主要要求是
- 尽可能准确地捕捉变化
- 将性能成本降至最低。
例如一个业务对象:
public class MainClass1
{
public MainClass1()
{
detailCollection1 = new ClassDetailCollection1();
detailCollection2 = new ClassDetailCollection2();
}
private Int64 id;
public Int64 ID
{
get { return id; }
set { id = value; }
}
private DateTime timeStamp;
public DateTime TimeStamp
{
get { return timeStamp; }
set { timeStamp = value; }
}
private string category = string.Empty;
public string Category
{
get { return category; }
set { category = value; }
}
private string action = string.Empty;
public string Action
{
get { return action; }
set { action = value; }
}
private ClassDetailCollection1 detailCollection1;
public ClassDetailCollection1 DetailCollection1
{
get { return detailCollection1; }
}
private ClassDetailCollection2 detailCollection2;
public ClassDetailCollection2 DetailCollection2
{
get { return detailCollection2; }
}
//more collections here
}
public class ClassDetailCollection1
{
private List<DetailType1> detailType1Collection;
public List<DetailType1> DetailType1Collection
{
get { return detailType1Collection; }
}
private List<DetailType2> detailType2Collection;
public List<DetailType2> DetailType2Collection
{
get { return detailType2Collection; }
}
}
public class ClassDetailCollection2
{
private List<DetailType3> detailType3Collection;
public List<DetailType3> DetailType3Collection
{
get { return detailType3Collection; }
}
private List<DetailType4> detailType4Collection;
public List<DetailType4> DetailType4Collection
{
get { return detailType4Collection; }
}
}
//more other Types like MainClass1 above...
我可以假设我可以访问对象的旧值和新值。
在这种情况下,我可以想出 2 种方法来尝试做到这一点,而不会被告知发生了什么明确的变化。
- 使用反射并遍历对象的所有属性并进行比较 那些有相应的 旧对象的属性。日志 任何已更改的属性。这 方法似乎更灵活,在 如果有的话我不用担心 新属性被添加到任何 对象。但它似乎也表现 重。
- 在所有对象的所有属性的设置器中记录更改。 除了这将 需要我修改很多代码,它 似乎更暴力。这将成为;这将是 维护繁重且不灵活,如果 一些人更新任何对象 类型。但这种方式也可能是 表演灯,因为我不会 需要检查发生了什么变化并记录 究竟是什么属性发生了变化。
欢迎提出任何更好的方法和/或改进上述方法的建议
【问题讨论】:
-
我写了一个基于反射但预编译的单对象(对)比较器来获得答案。所以它可以相对便宜地完成。离开弓,所以不能看 - 但稍后会尝试找到它。
标签: c# enterprise audit