我的应用程序中有多个业务对象(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...
我可以假设我可以访问对象的旧值和新值。
在这种情况下,我可以想到两种尝试这样做的方法,而不会被告知明确改变了什么。
- 使用反射并通过对象的所有属性进行迭代并进行比较 那些与之对应的 旧对象的属性。日志 任何已更改的属性。这个 方法似乎更灵活,在 如果有的话,我不必担心 新属性被添加到任何 对象。但它似乎也表现出色 重。
- 记录所有对象的所有属性的setter中的更改。 除了这样的事实 需要我改变很多代码,它 似乎更蛮力。这将会 维护沉重而且不灵活 有人会更新任何对象 类型。但这种方式也可能 因为我不会这样做 需要检查更改和记录的内容 究竟改变了哪些属性。
醇>
建议采取任何更好的方法和/或改进上述方法
答案 0 :(得分:3)
最佳方法称为Aspect-Oriented Programming或AOP。您将“建议”注入setter和getter(实际上所有方法执行,getter和setter都只是特殊方法),允许您“拦截”对对象执行的操作。查看{A {3}}或Spring.NET了解.NET AOP解决方案。
答案 1 :(得分:2)
我可能无法给你一个好的答案,但我会告诉你,在绝大多数情况下,选项1不是一个好的答案。我们在项目中处理一个非常相似的反思“图形漫步者”;当时似乎是一个好主意,但这是一场噩梦,原因如下:
如果您跳过“更改处理程序”反射模式,并且在您正在执行的“工作单元”中包含审计日志或任何预先持久性逻辑的创建,我认为您将为自己省去很多麻烦在业务层,通过一组“审计记录器”。这允许进行更改的逻辑使用算法选择模式(如命令或策略)来告诉您的审计框架确切地发生了哪种更改,因此它可以选择将生成所需日志消息的记录器。
答案 2 :(得分:0)
请点击此处adempiere如何更改日志:http://wiki.adempiere.net/Change_Log