需要在WCF中分离数据合同和服务合同

时间:2011-06-16 13:50:21

标签: c# wcf

当我尝试创建新的WCF项目时,默认情况下Visual Studio 2010会生成以下内容。有一个界面用于定义methonds(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是否可以帮助减少客户端和服务器之间的任何依赖性。也就是说,我觉得当我更改datacontract时,我不必重新编译客户端代码,因为它只是具有接口(服务合同)。我的假设是正确的还是我错过了什么!?

2 个答案:

答案 0 :(得分:2)

ServiceContract定义那些操作消耗的操作和消息并返回

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

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

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

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

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

答案 1 :(得分:1)

当您编程到接口时,只要实现接口并且您不需要重新编译客户端,实现就可以更改。但是,听起来您正在尝试更改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的某些事情是正确的(因为它是合同)。如果您对该合同进行了重大更改,那么您将打破客户。