1

私が現在取り組んでいるプロジェクトでは、Web サービスを介して 40 を超えるさまざまなサプライヤーからいくつかのデータを取得し、顧客に表示する前にそれらをまとめています。
各サプライヤは、さまざまなタイプのサービスを提供しています (送信するリクエストには SOAP 呼び出し、POST または GET による単純なクエリ文字列などがあります)。現時点ではシステムが少し乱雑ですが、個々のサプライヤー クラスがオーバーライドするGetSupplierData(Request request)
という抽象メソッドを持つ基本クラスがあります。問題は、各サプライヤ クラスがそのメソッド内で完全に異なる処理を実行し、リクエストのさまざまな部分にタイムアウトを設定することなどです。私の仕事は、すべてのサプライヤに共通のビジネス ロジック/タイミング/ロギングを実装することなので、このメソッドを変更する必要があると思います。 .
全体的なプロセスは、ビジネス ロジックに従って最大 4 つの異なる段階に分けることができます。

  • サプライヤー固有のリクエストを生成する
  • そのリクエストを送信し、応答を待ちます
  • 応答を共通の形式にマップします (そのクラスCommonResponseを呼び出します)
  • CommonResponseの後処理(ここでは、ロジックはすべてのサプライヤーに共通であるため、基本クラスに実装されています)

このロジックに従って、テンプレート メソッド デザイン パターンを実装することにしました。基本クラスにビジネス ロジック メソッドを作成し、上記のビジネス ロジックの最初の 3 つのステップを表す 3 つの抽象メソッドを作成しました。

public class SupplierBase
{
    protected abstract XDocument generateRequest(Request request);
    protected abstract XDocument sendRequest(XDocument request);
    protected abstract CommonResponse mapResponse(XDocument response);

    public CommonResponse process(Request request)
    {
        return mapResponse(sendRequest(generateRequest(request)));
    }
}

私が気に入らないのは、ある種のプロキシ オブジェクトではなく、XDocument を操作することです (したがって、Linq To XML を使用してサプライヤ リクエストを作成します)。一方で、非常に多くの完全に異なるプロキシ オブジェクトを関数の内外に渡す場合、テンプレート パターンを実装する方法がわかりません。ある時点で、すべての要求を XML で表すことができる (場合によってはそうしなければならない) ことを知っています。また、すべてのサプライヤーからの戻り値が XML であることも知っているため、マッピングされたサプライヤー固有ではなく XDocument を使用することにしました。そのxmlを表すオブジェクト(およびシリアライズ/デシリアライズ)。
それにもかかわらず、私はこれがもっとうまくできるという奇妙な感覚を持っています。
過去に似たようなことをした人はいますか?どうやってそれについて行きましたか?私はどんな指針にも大いに感謝します。

4

2 に答える 2

1

ジェネリックを使ってプロキシ オブジェクトを使用することはできませんか? 何かのようなもの

public abstract class SupplierBase<TRequest, TResponse>
    {
        protected abstract TRequest generateRequest();
        protected abstract TResponse sendRequest (TRequest request);
        protected abstract CommonResponse mapResponse (TResponse request);

        public CommonResponse process(TRequest request)
        {
            return mapResponse(sendRequest(generateRequest()));
        }
    }

    // an implementing class...
    public class SupplierA:SupplierBase<RequestA, ResponseA>
    {
        protected override RequestA generateRequest()
        {
            return new RequestA();
        }

        protected override ResponseA sendRequest(RequestA request)
        {
            // call with the request and return the specific response
        }

        protected override CommonResponse mapResponse(ResponseA request)
        {
            // map the specific response to the common response
        }
    }
于 2013-08-28T08:19:57.617 に答える
0

私は同様のプロジェクトに取り組んでいます。あなたが取り組んでいるものと非常によく似ています。

サプライヤの応答の履歴が必要なので、個々のサプライヤ クラスでデータベースに応答を書き込み (応答の関連部分を解析した後)、後でメイン スレッドからアクセスします。

于 2013-08-28T07:57:24.223 に答える