我有一个接口,在某个月内,我想向该接口添加参数。
我在某个地方读到(链接丢失了),当我使用Datacontracts时,我可以很容易地将Properties添加到数据域。新属性将不会发送到旧客户端上的服务器。
理论上,我只有一个接口,我的新老客户端可以使用该接口。我明白了吗?
但现在我正在与微软的验证块合作。这是否破坏了我拥有易于维护的接口的“特性”?
使用验证块管理不同版本的接口的好方法是什么?
发布于 2014-07-07 15:02:33
现在还不清楚您是指对ServiceContracts上的方法进行更改,还是指对DataContracts中的数据进行更改,但是,这两种方法都有一定程度的可兼容性:
对于服务合同,来自MSDN
添加由服务公开的服务操作是一个无损的更改,因为现有客户端不需要关心这些新操作。
但有条件:
将操作添加到双工回调合同是一项重大更改。
在末尾添加新参数--现有方法签名可能适用于来自旧版本的客户端调用,但将导致传递类型的默认值--例如引用类型为null,数值类型为零,等等。这可能会中断一些事情,并需要额外的验证(例如,DateTime.MinValue不会很好地与Sql DateTime列结合。
类似地,对于DataContracts,来自MSDN
在大多数情况下,除非需要严格的模式有效性(新实例对旧模式进行验证),否则添加或删除数据成员并不是一项重大更改。
新的数据成员属性将被默认,过时/删除的属性将被忽略。
还可以使用Name属性在DataMembers上重命名成员。
VAB将遵循同样的规则--即对新字段的任何验证都需要知道所提供的缺省值,这意味着您无法验证新字段。
一旦客户端连接到您的服务,追溯进行这样的更改并不是一个好主意--首先正确地设计一个接口,然后再制定一个版本控制策略,这样您就可以为老客户端提供一个外观,让它连接到旧的接口,然后实际将旧的格式转换成新的接口,并对丢失或过时的数据进行深思熟虑的映射和默认决策。
https://stackoverflow.com/questions/24612886
复制相似问题