问题在于:我们的主要班级(比如:合同)每年都在变化。添加了一些属性,删除了其他属性。我们不知道明年的情况如何。它可能会发生很大变化或根本不变。
另一方面,我们现在(新要求......)必须保持每个合同的历史性。每次用户更新合同时,整个对象都必须存储在备份中(例如 - 在表格中序列化)。
当然,我们必须能够阅读它...一个选项(残酷)是每年都有一个新的合同类(Contract2008,Contract2009,......)。
但是它会非常麻烦(而且很难看),因为许多课程都依赖于契约 - 事实上,我们每年都要创建一堆新课程。
曾经遇到过这种问题吗?有什么建议吗?
提前致谢!
(我们正在使用C#2.0。)
补充:感谢您的回答。我们现在问自己如何使用字典/ XML文件来实现版本控制,而不会破坏所有代码。在这种情况下,词典似乎非常性感:o)
答案 0 :(得分:3)
停止序列化对象。相关地存储数据。序列化的目的是在短时间内,比如在线路上流式传输;不是永久存储。
而不是将字段编码到类中;听起来你可能需要更多的字典结构,可以根据year存储的数据库配置值动态提取字段。然后基于这些值构建动态UI。每年必须创建一个新类并测试代码似乎难以维护。
答案 1 :(得分:2)
我首先想到的是我的头脑。实现一种“功能”文档。一个列表(或XML文档),详细说明联系人版本及其包含的属性。
对Contract进行操作的每个函数都应检查是否支持特定属性(“功能”)。
例如:
Contract2008 Capabilities
-----
has Name
has Stipulations
can DoMagic
-----
>
> Contract2009 Capabilities
> -----
> has Name
> has Stipulations
> can DoMagic
> -----
合同类将存储功能文档和一些通用的getter setter。
Contract
GetCapabilities()
Set(field, value)
Get(field, value)
set和get将在设置或获取值之前检查功能是否支持该字段。
(这必须是一种模式或某种东西,任何人?)
答案 2 :(得分:2)
您很可能不必将属性实现为C#属性。您实际上可以在某种字典中存储属性,并使用Get和Set方法来读取它们/枚举它们。在这种情况下,您可以每年使用同一个班级。
如果属性具有属性,那么我建议每年使用该类构建一个新程序集,并动态加载程序集。然后,您可以使用反射来查看每个Contract对象支持的属性。为了让您的生活更轻松,我建议您为不会更改的属性设置接口,并使组件中的Contract类更容易识别。