2011-06-16 57 views
1

默认情况下,Visual Studio 2010在尝试创建新的WCF项目时会生成以下内容。有一个接口用于定义方法(WCF术语中的操作契约)和一个定义服务契约定义将使用的数据的排他类。需要在WCF中分离DataContracts和ServiceContract

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是否可以帮助减少客户端和服务器之间的任何类型的依赖。也就是说,我觉得当我更改数据合同时,我不必重新编译客户端代码,因为它只是具有接口(服务契约)。我的假设是正确的还是我错过了什么!?

+0

这是我的理解,如果你分开与接口的关注,如果客户端中使用的接口不改变,那么你不需要重新编译或重新分配。 – Nair 2011-06-16 13:54:42

回答

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的某些事情是真实的(因为它是合同)。如果您对该合同进行了重大更改,您将打破客户。

2

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

DataContract限定从.NET对象到XML序列

DataContracts上使用ServiceContracts来描述其序列而言的消息的XML class

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

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

所以,如果更改对客户端来说是一个突然的改变,要么导致序列化器失败,要么导致序列化器产生不希望的副作用,那么你将不得不改变客户端。如果不是,那么客户端可以继续运行不变