5

假设我在生产 PC 中运行 wcf 服务。只是指导我需要在代码中添加什么来为我的服务提供版本。

我是否需要分别维护服务合同和数据合同的版本....只需给我一个创建至少两个版本的 wcf 服务的小例子。

如果少数几个客户正在使用我的服务,并且如果我更改任何现有的服务合同方法或向服务合同添加更多方法,那么会发生什么......在这种情况下,客户可以调用我的服务或者他们需要再次创建代理以获取服务合同的更改。如果有人用小的示例代码讨论我的所有观点以清楚地了解这个想法,那将非常有帮助。谢谢

4

1 回答 1

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 个控制器处理需要执行的任何(业务)逻辑,从而防止任何可能的重复代码。

于 2013-01-01T10:31:29.440 回答