私が現在取り組んでいるプロジェクトでは、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を表すオブジェクト(およびシリアライズ/デシリアライズ)。
それにもかかわらず、私はこれがもっとうまくできるという奇妙な感覚を持っています。
過去に似たようなことをした人はいますか?どうやってそれについて行きましたか?私はどんな指針にも大いに感謝します。