サービス構成は、SOA の基本的な部分です。サービス インベントリによって提供されるすべての機能は、必要に応じて、そのインベントリ内の他のサービスを利用して、小さなコンポーネント パーツから実行するタスクを構築することが期待されます。ただし、これはすべてアーキテクチャ レベルのものです。実装レベルでは、この構成はどのように行われるのでしょうか?
この状況を考えてみましょう。/process-request
「実際の」リソースを生成するために大きなファイルを非同期的に処理することに関連する追加のリソースを管理するリソースを投稿することを含む「タスク サービス」があります。最終的な「実際の」リソースを PartsInventory と呼びましょう。そのため、PartsInventory の URL と名前を/process-request
サービスに提供すると、PartsInventory の「プレースホルダー」が作成され、URL にある大量の csv ファイルを実際の PartsInventory に変換する非同期 ETL が開始されます。この非同期ジョブが失敗すると、プレースホルダーが削除され、/process-request
サービスへのクエリに失敗が反映されます。成功すれば、/process-request
さて、コードの観点からする/process-request
と、 と PartsInventoryの間の相互作用の実装はどのように
見えるでしょうか? 公開されたサービスにリクエストを POST しています/parts-inventory
か、それとも ORM オブジェクトを呼び出してプレースホルダーを作成していますか? 前者の場合、私は公開された契約を順守しており、自分のサービスの消費者として振舞っています。これはコンポーザビリティの原則に適合しているように見えますが、同じコードベース内からこのようにやり取りするのは非常に厄介です。一方、後者は、/process-request
ハンドラーが PartsInventory プレースホルダーを独自に作成する方法を知っていることを前提としているため、それ自体がぎこちなく感じられます。3 番目のオプションは、PartsInventory オブジェクトに特殊な静的ファクトリ メソッドを作成することPartsInventory.create_placeholder()
です。
/process-request
コードは少なくとも、PartsInventory オブジェクトのコンストラクターの依存関係を認識していません。ただし、これでも作成は 2 つの場所に分けられます。
これに遭遇しましたか?この質問に対する標準的な「正しい答え」はありますか?