3

好吧,这里什么都没有。在阅读了关于服务版本控制和数据合同版本控制的最佳实践 ( http://msdn.microsoft.com/en-us/library/ms733832.aspx ) 之后,我基本了解它是如何完成的。我计划对数据合同使用敏捷版本控制,但无法弄清楚创建 WorkRequestV2 以添加新属性或仅将新属性添加到 WorkRequestV1 之间有什么区别或更好的做法。现在我尝试了两种方法并且它有效但是当我创建 WorkRequestV2 时我必须修改 ServiceContractor 以使用 WorkRequestV2 为什么要这样做而不是仅仅向 WorkRequestV1 添加属性?有什么不同?

我查看的示例在这里 ( http://msdn.microsoft.com/en-us/library/ms731138.aspx ) CarV1 和 CarV2 为什么不将 HorsePower 添加到 CarV1 而不必创建一个全新的合同。

[DataContract(Name = "WorkRequest")]
public class WorkRequestV1 : IExtensibleDataObject {
    [DataMember(Name = "workrequest",Order=1,IsRequired=true)]
    public int workrequest { get; set; }
    [DataMember(Name = "CQ")]
    public string CrewHeadquarter { get; set; }
    [DataMember(Name = "JobCode")]
    public string JobCode { get; set; }
    [DataMember(Name = "JobType")]
    public string JobType { get; set; }
    [DataMember(Name = "Latitude")]
    public string Latitude { get; set; }
    [DataMember(Name = "Longitute")]
    public string Longitute { get; set; }

    private ExtensionDataObject theData;
    public ExtensionDataObject ExtensionData {
        get {
            return theData;
        }
        set {
            theData = value;
        }
    }
}
4

1 回答 1

1

再次阅读数据合同版本控制(您的第二个链接)

这是该页面的引用:

重大变更与非重大变更

对数据合同的更改可以是破坏性的或非破坏性的。当以非破坏性方式更改数据合约时,使用旧版本合约的应用程序可以与使用新版本合约的应用程序通信,使用新版本合约的应用程序可以与使用旧版本合约的应用程序通信。另一方面,重大更改会阻止一个或两个方向的通信。

对于您的情况,添加一些其他属性是一项非破坏性更改。只要您没有严格的模式验证(例如新属性没有在它们上标记“必需”),您就可以非常安全地将属性添加到现有数据合同而不是创建新的数据合同

与新服务通信的旧客户端仍然继续工作,新属性的值将保持默认值。与旧服务通信的新客户端也将起作用,因为新属性将被忽略。

但是正如您所看到的,您会遇到一个问题,即如何确保新客户端与新服务通信,以及旧客户端与旧服务通信?如果这不是问题,那么您就没有问题。否则,您可能需要引入新的数据合同。

进一步阅读:

MSDN 服务版本控制

IBM Web 服务版本控制的最佳实践

Oracle Web 服务版本控制

您的 WebService 版本控制最佳实践是什么?

于 2013-03-12T21:24:20.987 回答