【问题标题】:Swapping between versions of a webservice c#在 web 服务 c# 的版本之间交换
【发布时间】:2014-04-16 00:10:55
【问题描述】:

我希望维护调用现有 Web 服务的代码,但我希望能够调用相同 Web 服务的更新版本(基于配置设置)。我需要有不同的命名空间,因为 web 服务是同名的。有没有人有任何最佳实践模式来实现这一点?

谢谢, 史蒂文

【问题讨论】:

  • 您希望能够在应用程序的一个实例中调用这两个 Web 服务,还是根据配置设置仅调用其中一个?
  • 你需要查找“工厂”模式。

标签: c# web-services versioning


【解决方案1】:

“工厂”模式(也可能是“门面”模式)是您的朋友。

因此,假设您有两个服务实现了一个或一组通用方法,您可以通过这种方式创建一个通用服务工厂:

我假设您有两个名为 ServiceOldServiceNew 的服务(它们可能具有相同的名称并位于不同的命名空间中,就像您的情况一样)。并且这些服务共享一个共同的方法public string GetName();

首先我创建一个包含这些服务的接口:

public interface IService
{
    string GetName();
}

现在,如果您可以直接修改服务代码,您可以直接在您的服务上实现此接口,或者您可以继承您的服务并实现此接口。我将假设您的服务都不受您的控制并且是密封的。所以我会实现两个包装器(或外观)类。

public class ServiceOldWrapper : IService
{
    private ServiceOld _inner = new ServiceOld();
    public string GetName()
    {
        return _inner.GetName();
    }
}

public class ServiceNewWrapper : IService
{
    private ServiceNew _inner = new ServiceNew();
    public string GetName()
    {
        return _inner.GetName();
    }
}

现在我可以编写工厂类了。

public class ServiceFactory
{
    public IService CreateService()
    {
        if (configValueThatYouNeedToRead == "Old")
        {
            return new ServiceOldWrapper();
        }
        else
        {
            return new ServiceNewWrapper();
        }
    }
}

现在调用它变得简单了:

var sf = new ServiceFactory();
var s = sf.CreateService();
var name = s.GetName();

你可能需要比我更好地处理你的服务,所以你的代码会更复杂一些,但这应该让你开始。

【讨论】:

    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 2013-02-09
    • 2011-11-20
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    相关资源
    最近更新 更多