如何维护同一个wcf服务的多个版本

时间:2012-12-31 18:13:03

标签: wcf

假设我在生产pc中运行了wcf服务。只需指导我需要添加代码以便为我的服务提供版本。

我需要单独维护服务合同和数据合同的版本吗?只是给我一个创建至少有两个版本的wcf服务的小例子。

如果几个客户正在消费我的服务,如果我改变任何现有的服务合同方法或添加更多的方法来服务合同那么会发生什么......在那种情况下客户可以拨打我的服务或他们需要再次创建代理才能获得服务合同的变更。如果有人用小样本代码讨论我的所有观点以清楚地了解这个想法,那将会非常有帮助。感谢

1 个答案:

答案 0 :(得分:3)

您需要考虑一些事项。首先,您需要为合同和模式/消息添加名称空间。为什么?好吧,因为如果版本1和版本2有类似的操作和消息,它们可能会相互冲突。添加名称空间将让代码/客户端知道他正在处理2种不同的实现。

其次,您可能想问为什么要更改服务合同。是因为需要添加需求操作。或者它是一个全新的功能,可以分成新的WCF服务。如果要维护版本,请将全新功能放入新服务中,如果必须是当前服务的一部分,请复制合同并创建单独的版本。

更改服务合同将破坏当前正在使用该合同的客户。为该服务创建单独的版本将允许您当前的客户端继续使用以前的版本,直到您更新该客户端。所以你会得到这样的东西。

namespace MyNamespace.Contracts.V1
{
    [ServiceContract(Namespace = "urn:company:project:servicename:v1")]
    public interface IService
    {
        [OperationContract]
        void RequirementA();
    }
}
namespace MyNamespace.Contracts.V2
{
    [ServiceContract(Namespace = "urn:company:project:servicename:v2")]
    public interface IService
    {
        [OperationContract]
        void RequirementA();

        [OperationContract]
        void RequirementB();
    }
}

两个版本将分别托管,您的实施也会有所不同。但是,您可以让实现将您的操作委托给某种(业务)控制器,它支持两个版本,您的流程将看起来像这样。

  • V1.IService - V1.Implementation将委托对MyServiceController的调用
  • V2.IService - V2.Implementation还会委托对MyServiceController的调用

通过这种方式,您可以让1个控制器处理需要执行的任何(业务)逻辑,从而防止任何可能的重复代码。