1

问题是:我们的主要课程(比如:合同)每年都在变化。添加了一些属性,删除了其他属性。我们不知道明年会是什么样子。它可能会发生很大变化或根本不会发生变化。

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

当然,我们必须能够读回它......一个选择(残酷)是每年都有一个新的合同类(合同2008,合同2009,......)。

但这会非常麻烦(而且丑陋),因为很多类都依赖于 Contract - 事实上,我们每年都必须创建一堆新类。

有过这种问题吗?有什么建议吗?

提前致谢 !

(我们使用的是 C# 2.0。)

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

4

3 回答 3

4

停止序列化对象。以关系方式存储数据。序列化的目的是短时间,比如通过网络进行流式传输;不是永久存储。

而不是将字段编码到类中;听起来您可能需要更多的字典类型的结构,可以根据年份存储的数据库配置值动态提取字段。然后基于这些值构建动态 UI。每年都必须创建一个新类并测试代码,维护起来似乎非常昂贵。

于 2009-01-16T05:31:17.060 回答
2

我能想到的第一件事。实现一种“能力”文档。详细说明联系人版本及其包含的属性的列表(或 XML 文档)。

在 Contract 上运行的每个函数都应检查是否支持特定属性(“功能”)。

例如:

Contract2008 Capabilities
-----
has Name
has Stipulations
can DoMagic
-----
>     
>     Contract2009 Capabilities
>     -----
>     has Name
>     has Stipulations
>     can DoMagic
>     -----

合同类将存储功能文档和一些通用的 getter 设置器。

Contract
  GetCapabilities()
  Set(field, value)  
  Get(field, value)

set 和 get 将在设置或获取值之前检查功能中是否支持该字段。

(这一定是一种模式或什么,有人吗?)

于 2009-01-16T05:19:36.867 回答
2

很可能您不必属性实现为 C# 属性。您实际上可以将属性存储在某种字典中,并使用 Get 和 Set 方法来读取/枚举它们。在这种情况下,您可以每年使用相同的课程。

如果属性真的必须是属性,那么我建议每年使用该类构建一个新程序集,并动态加载程序集。然后,您可以使用反射来查看每个 Contract 对象支持哪些属性。为了让您的生活更轻松,我建议您为不更改的属性提供一个接口,并使其更容易识别程序集中的 Contract 类。

于 2009-01-16T05:31:00.993 回答