代码之家  ›  专栏  ›  技术社区  ›  Jasmeet

“相同的数据契约”到底意味着什么?

  •  0
  • Jasmeet  · 技术社区  · 6 年前

    我正在经历 Best Practices: Data Contract Versioning

    我经历过 Data Contract Equivalence

    根据以下规范:

    尽管在这些示例中名称已更改(通过添加“2”),但是 建议更改名称空间,而不是通过附加 具有版本号或日期的新命名空间。例如 “http://schemas.contoso.com/2005/05/21/PurchaseOrder”数据合同 会变成 “http://schemas.contoso.com/2005/10/14/PurchaseOrder”数据合同。

    这是否意味着更改数据协定的“Name”或“Namespace”将使其成为新的数据协定,并且如果两个数据协定具有类似的“Name”和“Namespace”属性值,则它们是相同的?

    我这里有什么不对劲吗?

    同样的数据契约和等价的数据契约有什么区别吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Kjartan madhukar Jha    6 年前

    简而言之:是的:每个定义有两个名称空间不同的契约,两个不同的契约,即使它们定义的操作相同,而两个名称和名称空间相同的契约将被假定为相同的契约。

    这里重要的一点是,您可以有两个契约(具有两个不同的名称空间),它们仍然兼容或部分兼容, .

    作为一个(有些枯燥和理论上的)例子,假设您有一个定义这两个操作的契约: Do-X Do-Y . 现在说你决定搬走 多伊 换成新的手术 Do-Z

    因此,最佳实践是保持契约的相同名称,但更改名称空间以反映功能的更改。这将如何影响任何客户可能取决于以下几个因素:

    • 如果客户端不验证架构,并且不使用 (但仅限于 溶解氧 ),则即使服务使用新合同,并且客户端仍在使用旧合同,该客户端仍应能够与服务通信。

    • 如果客户 需要架构验证,他将需要使用与托管服务相同的架构(命名空间),否则验证将失败。

    • 多伊 ,但不验证架构,在尝试执行操作之前可能看不到任何错误 ,此时它显然会失败。

    为了避免像上例中那样的错误,典型的最佳实践是 如果可能;如果在上面的示例中,您添加了 多兹 多伊

    但是,如果使用严格的验证,则旧客户机在 多兹 已添加。实际上,即使操作完全相同,它也不能与新合同一起工作;在这里,您可以说旧合同和新合同 相等的 (它们定义了完全相同的操作),但仍然 不一样 ,因为它们位于不同的名称空间中。