4

如果我需要退出此服务合同:

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IService1
{
   [OperationContract(Name = "AddCustomer")]
   bool AddCustomer(DTOCustomer1 customer);
}

对此:

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IService1
{
   [OperationContract(Name = "AddCustomer")]
   bool AddCustomer(DTOCustomer2 customer);
}

并根据这篇好文章:Versioning WCF我了解,当数据合同发生变化时,需要在新命名空间中定义新的数据合同与数据合同,然后在新的命名空间中定义新的服务合同,之后是一个新的端点应该添加。

我到底应该怎么做。有没有任何地方的例子?你能根据我上面显示的服务合同写点什么吗?

先感谢您!

4

2 回答 2

4

根据链接的文章,您应该执行以下操作:

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IServiceNew : IService1
{
   [OperationContract(Name = "AddCustomerNew")]
   bool AddCustomer(DTOCustomer2 customer);
}

然后在您的服务中实现它:

public class MyCurrentServiceImplementation : IServiceNew 
{...}

您将需要重新部署您的服务,但现有客户端应该能够继续调用AddCustomer操作,并且新客户端可以调用AddCustomerNew操作。

于 2012-01-10T18:58:12.920 回答
3

请务必注意您在帖子中陈述的假设:

“当数据合同发生变化时,需要在新命名空间中定义新的数据合同与数据合同”

并不总是正确的。请参阅MSDN 上的“数据合同版本控制” ,了解数据合同更改是非破坏性的,因此可能不需要任何操作,除了可能修改服务方法的内部实现以处理某些数据的存在/不存在,因为数据合约版本之间的差异。

在这个具体的例子中,我会质疑一个被调用的方法的两个版本如何AddCustomer在它们的意图上如此不同,以至于它证明创建一个新的服务接口是合理的。如果没有看到您的新旧数据合同,我无法确定,但我猜这里真正的问题是该方法已经发展到接受额外的客户信息。

如果这是真的,那么它非常类似于方法调用中可选参数的情况。WCF 旨在很好地处理这种情况,作为对数据协定的非破坏性更改。只要您可以遵循MSDN 上“最佳实践:数据合同版本控制”中的指南,那么提供旧版本或新版本合同的调用将被您现有的服务接口很好地接受。鉴于客户端和服务器数据合同的组合,您的服务方法将获得可能的数据。

我会保持我的服务接口连贯、简单和干净(即避免做 IServiceNew 之类的事情),而只是添加到数据契约并修改其实现AddCustomer以适应它接收到的任何数据。

于 2012-09-13T20:23:16.817 回答