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

时间:2013-07-17 13:57:51

标签: c# web-services oop design-patterns interface

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

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

现在市场上有一个标准供应商,提供任何人都可以在他的服务器上托管并创建网络服务的软件。所以,我们可以说它托管在两个地方: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);

但是这不会编译,因为父类不知道Service所有的方法是什么,它会产生以下错误:

'对象'不包含' GetSources'的定义没有扩展方法' GetSources'接受类型'对象'的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)

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

如果我能以某种方式做出服务"对象知道它的接口(即函数签名),它将正常工作。

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

2 个答案:

答案 0 :(得分:0)

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

CurrencyConverter中的

 public abstract IMyNewServiceThingy GetService();

基类现在可以使用此类来获取服务并在其上调用方法

在每个派生类中:

public override IMyNewServiceThingy GetService()
{
   return Service;
}

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

答案 1 :(得分:0)

我终于使用反射解决了这个问题(礼貌Manas Agarwal)

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