外部SOAP web服务(C#)的本地接口

外部SOAP web服务(C#)的本地接口,c#,web-services,oop,design-patterns,interface,C#,Web Services,Oop,Design Patterns,Interface,我想在父方法中访问外部类(web服务)的方法(web服务在子类中实例化) 情况是这样的: 我有一个名为ConvertCurrency的母类,它接受美元并提供卢比。 例如,整数兑换货币(整数美元) 现在市场上有一家标准的供应商,它提供了一种任何人都可以在其服务器上托管并创建Web服务的软件。因此,假设它托管在两个地方:www.link-A.com/service.asmx和www.link-B.com/service.asmx 我有一个父类:CurrencyConvertor,它有两个子类:Con

我想在父方法中访问外部类(web服务)的方法(web服务在子类中实例化)

情况是这样的: 我有一个名为ConvertCurrency的母类,它接受美元并提供卢比。 例如,整数兑换货币(整数美元)

现在市场上有一家标准的供应商,它提供了一种任何人都可以在其服务器上托管并创建Web服务的软件。因此,假设它托管在两个地方:www.link-A.com/service.asmx和www.link-B.com/service.asmx

我有一个父类:CurrencyConvertor,它有两个子类:Convertor-a和Convertor-B

Class CurrencyConvertor
{
    protected Object Service;

    public Convert(int dollars)
    {
        Service.ConvertCurrency(dollars);
    }
}

Class Convertor-A : CurrencyConvertor
{
    public Convertor-A()
    {
        Service = link-A.service;
    }
}

Class Convertor-B : CurrencyConvertor
{
    public Convertor-B()
    {
        Service = link-B.service;
    }
}


// based on current response-time of the two servers, we decide 
// that B is faster and hence we make the decision at run-time that we should use 
// B's service

CurrencyConvertor cc = new Convertor-B();
cc.Convert(5);
但这不会编译,因为父类不知道服务的所有方法都有哪些,并且会出现以下错误:

“object”不包含“GetSources”的定义,并且找不到接受“object”类型的第一个参数的扩展方法“GetSources”(是否缺少using指令或程序集引用?)

我想知道有什么可能解决这个问题。当然,不必为两个提供程序中的每一个创建单独的转换函数

如果我能以某种方式让“服务”对象知道它的接口(即函数签名),它就可以正常工作


有没有办法解决这个问题?

在CurrencyConvertor中创建一个名为GetService()的抽象方法; 派生类必须以返回服务的方式实现此方法

电流转换器:

基类现在可以使用这个类来获取服务并对其调用方法

在每个派生类中:


在class-level上设置服务变量是一个错误的决定,更糟糕的是,当您在创建派生类(在构造函数中)时重置它时,您永远无法知道当前设置了哪个服务。。(特别是在使用IOC或异步调用时)

我终于通过反射找到了解决这个问题的方法(Manas Agarwal提供)


转换器a和b是否继承自CurrencyConverter?是@Stephan。感谢您指出:)我们已经更新了代码以反映相同的情况。我在这里遇到的问题是这两个服务的类型不同。A的是link-A.service,B的是link-B.service(link-A和link-B指的是我们在添加两个web引用时得到的两个名称空间)。现在,在基类中,我必须将其设置为:public abstract Object GetServices();在我的程序中,我执行以下操作:Object service=cc.GetService();现在,当我调用任何一个方法服务时,我会得到相同的错误-“object”不包含“GetSources”的定义。我是OOP新手,因此如果我误解了您的解决方案,请告诉我。当在服务上调用的方法对两个服务(两种类型)具有相同的签名时然后为这两个方法创建一个公共接口并返回。。嗯,在自动生成的代码方面,您可能会遇到一些问题不知道对不起。。我忘了退货类型了。。对象不会让您走得太远(除非您想在基类中强制转换对象或使用反射来调用方法-但我认为这不是必需的),谢谢Stephan。我创建了接口并添加了web服务的一个方法。在子类中,当我试图通过将服务强制转换到接口来返回服务时,它失败了。public override IWebService GetService(){return(IWebService)link-A.service;}接口IWebService{int ConvertCurrency(int$s);//需要添加web服务的其余方法}这里显式强制转换失败。我想我将通过添加web服务中存在的所有方法来完成接口,并查看转换是否成功。“尝试通过将服务转换到接口来返回服务”不需要转换。。当您的类(服务客户机类)实现接口时,您可以按原样返回对象(您返回一个imynewservicechingy-您忘记将接口添加到客户机类了吗?)
 public abstract IMyNewServiceThingy GetService();
public override IMyNewServiceThingy GetService()
{
   return Service;
}
Class CurrencyConvertor cc;
cc = new Convertor-A();

BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
MethodInfo m = cc.type.GetMethod(MethodName, flags);
response = (string)m.Invoke(cc.Service, Parameters);