2

アプリケーションで使用する必要のあるWebサービスを説明する顧客からのWSDLがたくさんあります。

アイテムを作成するためのWebサービス、クエリを実行するためのWebサービス、およびアイテムを更新するためのWebサービスがあります。これらのWSDLには多くの重複があります。作成、照会、更新する必要のある項目は、3つのWSDLすべてに同じように存在します。

svcutilを使用すると、3つのWSDLのプロキシを生成できますが、すべてのプロキシがアイテムを再度定義します。したがって、同じクラスを3回、異なる名前空間にのみ持っています。

これを使用すると、多くのコードを複製する必要があります(たとえば、プロキシクラスへのdomeinオブジェクトのマッピングは、すべてのプロキシに対してまったく同じ方法で実行する必要があります)。

私が考えることができる唯一の解決策は、プロキシを手動で編集し、重複を取り除くことです。ただし、プロキシを再生成するときに、Webインターフェイスの変更を管理するのが難しくなると思います。

どういうわけか一度にすべてのプロキシを生成することは可能かしら。

前もって感謝します。

4

1 に答える 1

1

すべての顧客の WSDL を解析し、操作などを何らかのマップ (またはマルチマップ) に格納するプログラムを作成することを検討してください。次に、マップを反復処理して重複を削除し、結果を別の最終的な WSDL に書き込み、この WSDL のコード生成を行います。ただし、名前空間で何かをする必要があります。

ただし、考慮すべき点: そのために必要なコードは、既に複製している追加のコード以上のものでしょうか?

もう 1 つのオプションは、複製された操作の Proxy クラスを定義することです。名前空間を使用して操作を追加して初期化する必要があります (名前空間文字列のマップを操作のマップに作成します。これは、実行するコード/オブジェクトにマップされた操作文字列になります)。次に、特定の操作を実行するたびに、操作対象の名前空間文字列を渡します。

名前空間 ns1、ns2、ns3 で Op1 を定義し、ns1 と ns2 で Op2 を定義したとします。次に、疑似コード (強く C++ に偏った) は次のようになります。

class ProxyOperations
{
    addOperation(string opName, string namespace, OperationBase op);
    // You'll have to figure out what to do with the operation parameters,
    // maybe wrap them in a parameter context
    void doOperation(string opName, string namespace) {
        // lookup operation object and execute it
    }
    typedef map<string, OperationsBase> OperMap;
    typedef map<string, operMap> NamespaceMap;
    NamespaceMap namespaceOperationMap_;
};

{
    ProxyOperations po;

    // Populate it
    po.addOperation("Op1", "ns1", oper1ObjectNs1);
    po.addOperation("Op1", "ns2", oper1ObjectNs2);
    po.addOperation("Op1", "ns3", oper1ObjectNs3);

    po.addOperation("Op2", "ns1", oper2ObjectNs1);
    po.addOperation("Op2", "ns2", oper2ObjectNs2);

    // now use it
    po.doOperation("Op1", "ns2");
}
于 2012-06-05T10:21:53.810 に答える