我有一个界面,在某个月我想为该界面添加参数。
我在某处读到(链接丢失),当我使用Datacontracts时,我可以轻松地将属性添加到datacontract。新属性将不会被发送到旧客户端上的服务器。
理论上我只有一个接口,而我的新旧客户端可以使用该接口。我明白这是对的吗?
但现在我正在使用Microsoft的validation Block。这是否打破了我的“功能”,即具有易于维护的接口?
使用验证块管理不同版本接口的好方法是什么?
答案 0 :(得分:2)
对于ServiceContracts
上的方法更改或DataContracts
中的数据更改,并不是很清楚,但是,两者都存在一定程度的不间断更改兼容性:< / p>
添加服务公开的服务操作是一项不间断的更改,因为现有客户不需要关心这些新操作。
附带条件:
向双工回调合约添加操作是一项重大改变。
在最后添加新参数现有方法签名可能适用于旧版本的客户端调用,但会导致传递类型的默认值 - 例如对于引用类型为null,对于数字类型为零等。这可能会破坏事物并需要进行额外验证(例如,DateTime.MinValue
无法与Sql DateTime
列完美匹配。
同样,对于DataContracts
,from MSDN
在大多数情况下,添加或删除数据成员不是重大更改,除非您需要严格的模式有效性(针对旧模式验证的新实例)。
新的datamember属性将被默认,并且将忽略过时/删除的属性。
您还可以使用Name
上的DataMembers
媒体资源重命名成员。
VAB将遵循相同的规则 - 即对新字段的任何验证都需要了解所提供的默认值,这意味着您无法验证新字段。
如果客户端连接到您的服务,那么追溯性地进行这样的更改并不是一个好主意 - 第一次正确设计界面,然后继续进行版本控制策略是值得的,您可以为旧版本提供外观客户端连接到旧接口,然后实际将旧格式转换为新格式,并对有关丢失或过时数据的故意映射和默认决策。