我希望维护调用现有Web服务的代码,但是这样我可以调用相同Web服务的更新版本(基于配置设置)。我需要具有不同的命名空间,因为webservice是相同的名称。有没有人有任何最佳实践模式来完成这个?
谢谢, 史蒂芬
答案 0 :(得分:0)
"工厂"模式(可能" Facade"模式)是你的朋友。
因此,如果你有两个服务来实现一个通用的方法或一组方法,你可以做这样的事情来建立一般的服务工厂:
我假设您有两个名为ServiceOld
和ServiceNew
的服务(它们可以具有相同的名称,并且根据您的情况设置在不同的名称空间中)。并且这些服务共享一种通用方法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();
您可能需要比我更好地处理清理服务,因此您的代码会更复杂,但这应该可以让您开始。