我的项目是第三方Web服务(旧式Web服务与WCF服务)的消费者,它有两个版本,"沙盒" (分期)和prod服务。这些服务上的API几乎完全相同,我正在寻找一种在两个版本之间进行干净切换的方法,最好不要使用条件编译。
我本能地匆匆离开并从Visual Studio"添加网络参考"生成的客户端中提取了一个界面,即AgentImport
,但该类不是部分的,所以我可以&# 39;使它从界面或任何其他超类派生。我已经为AgentImport
的所有客户端创建了AgentImport
实例,并且很好地封装在一个抽象基础中,但是如果不使用更高风险的编译器指令,我如何在{{1}的v1和v2之间切换}?
一些代码:
AgentImport
我已经尝试添加服务引用而不是Web引用,如下面的评论中所建议的那样,至少可以访问部分类,但是当我为生产服务添加第一个服务引用时,并从auto中提取接口生成的SOAP客户端,即using Clients.PrivateProperty.AgencyServicesApiService;
namespace Client.PrivateProperty
{
public abstract class PrivPropFacilityBase
{
protected static AgentImport Client;
protected PrivPropFacilityBase()
{
Client = new AgentImport();
Client.Timeout = 10000;
}
protected virtual AgentImport GetClient()
{
return new AgentImport();
}
}
}
,该接口引用在其他自动生成的类中声明的对象,与客户端在同一名称空间中,例如IAsapiClient
:
SecurityToken
如果我为登台服务添加第二个服务引用,则第二个自动生成的SOAP客户端引用其自己的命名空间中的对象,例如现在它使用void UpdateUniqueAgentID(string PrivatePropertyAgentId, string AgentId, AgencyServicesApiService.SecurityToken Token);
,所以我的编译器告诉我它没有实现我第一次提取的接口。然后我不得不为主接口AgencyServicesApiSandbox.SecurityToken
引用的每个对象提取一个新接口,这使得这个主接口只使用提取的合同,而不是实际的类名。
追求上述<我得出的结论是,我唯一可行且风险最小的方法是使用两个客户端项目,一个专门用于生产服务,另一个用于登台服务。然后,在执行时,我只需要担心在两个众所周知的,即不是自动生成的客户端对象之间动态选择。