【问题标题】:Need for separting DataContracts and ServiceContract in WCFWCF 中需要分离 Data Contracts 和 Service Contract
【发布时间】:2011-06-16 13:50:21
【问题描述】:

当我尝试创建新的 WCF 项目时,Visual Studio 2010 默认会生成以下内容。有一个用于定义方法的接口(WCF 术语中的操作合同)和一个排他类,用于定义服务合同的定义将使用的数据。

namespace iAMProxyService
{
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config.
    [ServiceContract]
    public interface IProxyService
    {

        [OperationContract]
        string GetData(int value);

        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);

        // TODO: Add your service operations here
    }


    // Use a data contract as illustrated in the sample below to add composite types to service operations.
    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";

        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }

        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }
    }
}

现在我想知道 DataContract 是否可以帮助减少客户端和服务器之间的任何依赖关系。也就是说,我觉得当我更改数据合同时,我不必重新编译客户端代码,因为它只是具有接口(服务合同)。我的假设是正确的还是我错过了什么!?

【问题讨论】:

  • 我的理解是,如果你单独关心接口,如果客户端使用的接口没有改变,那么你不需要重新编译或重新分发。

标签: c# wcf


【解决方案1】:

ServiceContract 定义了这些操作消耗和返回的操作和消息

DataContract 定义从 .NET 对象到 XML 的序列化

DataContracts 用在 ServiceContracts 上,根据其序列化类来描述消息的 XML

因此,如果您更改 DataContract,那么它将影响客户端要发送或接收的消息 - 这可能是客户端的重大更改。

然而,DataContractSerializer 是一个非常宽容的序列化程序(有些人可能会说太宽容了)。如果发送方发送接收方不期望的数据,则序列化程序会忽略该数据。如果发送方没有发送接收方期望的数据,那么只要数据没有在 DataContract 中标记为 IsRequired=true ,那么接收方只需默认一个值(例如,0 表示 int)

因此,如果更改是对客户端的重大更改,或者导致序列化程序失败或从序列化程序产生不希望的副作用,那么您将不得不更改客户端。如果没有,那么客户端可以继续原样运行

【讨论】:

    【解决方案2】:

    当您对接口进行编程时,只要它仍然实现该接口,实现就可以更改,您无需重新编译客户端。但是,听起来您正在尝试更改 DataContract 的接口。如果你改变它,你将(很可能)需要重新编译。我说最有可能是因为从技术上讲你可以添加它并且它不应该破坏任何东西(但它不遵守严格的架构合规性)。

    这是一篇关于中断与非中断更改的文章:

    http://msdn.microsoft.com/en-us/library/ms731138.aspx

    以及这样做的最佳实践:

    http://msdn.microsoft.com/en-us/library/ms733832.aspx

    最后,关于什么是 DataContract 以及如何使用它的教程:

    http://www.wcftutorial.net/Data-Contract.aspx

    DataContract 扩展了您的服务层。它是您使用的另一个界面。因此,您需要对 DataContract 遵循与其他接口相同的规则类型。客户会期望 DataContract 的某些事情是真实的(因为它是一个合同)。如果您对该合同进行破坏性更改,您将破坏客户。

    【讨论】:

      猜你喜欢
      • 2015-04-18
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多