我正在浏览最佳实践:数据协定版本控制,并对相同的数据协定的实际含义以及如何实际创建新的数据协定感到困惑。
我已经浏览了数据协定等效性,但不确定两者的含义是否相同。
根据规范中的以下块:
尽管在这些示例中更改了名称(通过附加"2"(,但 建议通过附加来更改命名空间而不是名称 具有版本号或日期的新命名空间。例如, 'http://schemas.contoso.com/2005/05/21/PurchaseOrder' 数据协定 将更改为 "http://schemas.contoso.com/2005/10/14/PurchaseOrder"数据协定。
这是否意味着更改数据协定的"名称"或"命名空间"使其成为新的数据协定,并且如果两个数据协定具有相似的"名称"和"命名空间"属性值,则它们是相同的?
我在这里弄错了什么吗?
同样的数据协定和等效的数据协定之间有什么区别吗?
简短回答:是:每个定义是两个具有不同命名空间的合约,两个不同的合约,即使它们定义的操作相同,而具有相同名称和命名空间的两个合约将被假定为同一合约。
这里重要的一点是,如果客户端接受,您可以有两个协定(具有两个不同的命名空间(,它们仍然相互兼容或部分可组合。
作为一个(有点枯燥和理论的(示例,假设您有一个定义两个操作的合约:Do-X
和Do-Y
。现在假设您决定删除Do-Y
并将其替换为新的操作Do-Z
。
最佳做法是保留协定的相同名称,但更改命名空间以反映功能更改。这将如何影响任何客户可能取决于几个因素:
-
如果客户端不验证架构,并且不使用
Do-Y
(但仅使用Do-X
(,则即使服务使用新协定,并且客户端仍在使用旧协定,该客户端也应该能够与服务通信。 -
如果客户端确实需要架构验证,则需要使用与托管服务相同的架构(命名空间(,否则验证将失败。
-
如果客户端使用
Do-Y
,但不验证模式,则在尝试执行操作Do-Y
之前,您可能看不到任何错误,此时它显然会失败。
为了避免上一个示例中的错误,典型的最佳实践是添加操作,但如果可能,不要删除操作;如果在上面的示例中,您在新版本中添加了Do-Z
,但没有删除Do-Y
,那么使用旧协定的非验证客户端仍然可以工作。
但是,如果使用严格验证,则在添加Do-Z
后,旧客户端将不会使用新的服务协定。事实上,即使操作完全相同,它也无法与新合同一起使用;在这里,您可能会说旧协定和新协定是等效的(它们定义了完全相同的操作(,但仍然不相同,因为它们驻留在不同的命名空间下。