1

親メソッドで外部クラス(Webサービス)のメソッドにアクセスしたい(Webサービスは子クラスでインスタンス化されている)

シナリオは次のとおりです。私は ConvertCurrency と呼ばれるマザー クラスを持っています。これはドルを受け取り、ルピーを提供します。例えば。int ConvertCurrency(int ドル);

現在、誰でも自分のサーバーでホストして Web サービスを作成できるソフトウェアを提供する標準的なベンダーが市場に出回っています。たとえば、www.link-A.com/service.asmx と www.link-B.com/service.asmx の 2 つの場所でホストされているとします。

親クラス: CurrencyConvertor があり、2 つのサブクラス: 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 が持つすべてのメソッドを認識しておらず、次のエラーが発生するため、これはコンパイルされません。

'object' には 'GetSources' の定義が含まれておらず、タイプ 'object' の最初の引数を受け入れる拡張メソッド 'GetSources' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)

この問題の可能な解決策は何でしょうか。もちろん、2 つのプロバイダーごとに個別の Convert 関数を作成する必要はありません。

何らかの形で「サービス」オブジェクトをそのインターフェイス (つまり、関数シグネチャ) に認識させることができれば、問題なく動作します。

この問題を回避する方法はありますか?

4

2 に答える 2

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);
于 2013-07-19T07:36:49.677 に答える
0

GetService() と呼ばれる CurrencyConvertor の抽象メソッドを作成します。派生クラスは、サービスを返す方法でこのメソッドを実装する必要があります...

CurrencyConverter で:

 public abstract IMyNewServiceThingy GetService();

基本クラスは、このクラスを使用してサービスを取得し、その上でメソッドを呼び出すことができるようになりました

すべての派生クラスで:

public override IMyNewServiceThingy GetService()
{
   return Service;
}

クラスで Service 変数を設定する - levellel は悪い決定であり、(コンストラクターで) 派生クラスを作成するときにそれをリセットすると、さらに悪いことに、どの Service が現在設定されているかを知ることはできません.. (特に IOC または非同期を使用する場合)コール)

于 2013-07-17T14:14:21.350 に答える