本地接口,可外接SOAP的Web服务(C#)

问题描述:

我要访问外部类的父类的方法(Web服务是在子类实例化)的方法(网络服务)本地接口,可外接SOAP的Web服务(C#)

的情况是这样的: 我有一个名为ConvertCurrency的母类,它接收美元并给出卢比。例如, int ConvertCurrency(int dollars);

现在市场上有一个标准的供应商,它提供了一个软件,任何人都可以在他的服务器上托管并创建一个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); 

但是,这不能编译,因为父类不知道所有的方法服务有它提供了以下错误:

“对象”不包含一个定义为“GetSources”和没有扩展方法'GetSources'接受类型'对象'的第一个参数可以找到(你是否缺少使用指令或程序集引用?)

我想知道什么可以是这个问题的可能解决方案。当然,不需要为两个提供者中的每一个创建单独的转换函数。

如果我能以某种方式使“服务”对象知道它的接口(即函数签名),它将工作得很好。

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

+0

做转换器A和B CurrencyConverter继承? – Stephan

+0

是@Stephan。感谢您指出:)有更新代码反映相同。 – texens

我终于拿到了这个问题使用反射(礼貌玛纳斯阿加瓦尔)溶液

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); 

在CurrencyConvertor中创建一个名为GetService()的抽象方法; 的派生类必须实现,他们返回该服务的方式这种方法...

在CurrencyConverter

public abstract IMyNewServiceThingy GetService(); 

的基类,现在可以使用这个类来获得该服务,它调用方法

在每一个派生类:

public override IMyNewServiceThingy GetService() 
{ 
    return Service; 
} 

在类上设置Service变量 - levlel是一个糟糕的决定,更糟糕的是,当您在创建派生类时(在构造函数中)重置它时 - 您永远无法知道当前设置了哪个Service(特别是。使用国际奥委会或异步调用)时

+0

我遇到的问题是这两种服务的类型不同。 A用于link-A.service,B用于link-B.service(link-A和link-B指向我们添加两个Web引用时获得的两个名称空间)。现在,在基类中,我必须将其设置为: public abstract Object GetServices(); 而在我的程序中,我这样做: Object service = cc.GetService(); 现在,当我打电话任何方法服务,我会得到同样的错误 - '对象'不包含'GetSources'的定义我是OOP的新手,所以请让我知道如果我有曲解了你的soln。 – texens

+0

当对服务调用的方法具有相同的两个服务(两种类型)的签名,然后为这两种方法创建一个公共接口,并返回..嗯,你可能有一些问题在这里与自动生成的代码.. - 不知道 – Stephan

+0

对不起..我忘了返回类型..对象不会让你很远(除非你想在基类中投射对象或使用反射来调用该方法 - 但这不是我认为必要的) – Stephan