如何实现“类版本化”(使用同一类的不同版本)

时间:2009-01-16 05:15:37

标签: architecture versioning

问题在于:我们的主要班级(比如:合同)每年都在变化。添加了一些属性,删除了其他属性。我们不知道明年的情况如何。它可能会发生很大变化或根本不变。

另一方面,我们现在(新要求......)必须保持每个合同的历史性。每次用户更新合同时,整个对象都必须存储在备份中(例如 - 在表格中序列化)。

当然,我们必须能够阅读它...一个选项(残酷)是每年都有一个新的合同类(Contract2008,Contract2009,......)。

但是它会非常麻烦(而且很难看),因为许多课程都依赖于契约 - 事实上,我们每年都要创建一堆新课程。

曾经遇到过这种问题吗?有什么建议吗?

提前致谢!

(我们正在使用C#2.0。)

补充:感谢您的回答。我们现在问自己如何使用字典/ XML文件来实现版本控制,而不会破坏所有代码。在这种情况下,词典似乎非常性感:o)

3 个答案:

答案 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类更容易识别。