4

フォームにオブジェクト (POCO クラス) を表示する必要があります。

私のコントローラーでは、オブジェクト リポジトリからオブジェクト データを取得します。

しかし、このフォームでは、countryid ではなく国名、割り当てられた人数 (1:N 関係から取得するため)、編集の履歴 (取得するため) など、オブジェクトに関するいくつかの追加データも表示する必要があります。さらに別のテーブルから)およびビット「CanBeCancelled」。

問題は、このロジックをどこに置くべきかということです。

私はこれらの代替案を思いつきました:

  • リポジトリ自体: この正確なビューモデルを返す追加の関数を作成します
  • クラスをビューモデルに変換する変換サービス (データを取得する場所を知っています)
  • コントローラー:ビュー(モデル)に表示するデータを知っているため、さまざまなリポジトリからすべてのデータを取得する必要があります

このロジックを配置する良い方法は何ですか (「このロジック」とは、人の数がリポジトリ A でフェッチされ、履歴がリポジトリ B でフェッチされ、国名が CountryRepository とブール値でフェッチされることを知るロジックを意味します'CanBeCancelled' は StateEngine サービスによって取得されます) ?

4

1 に答える 1

5

他に制約がない場合は、単一責任の原則で述べられている単純なルールに従います。各レイヤーは独自のジョブを実行し、他のレイヤーが適切にジョブを実行すると想定します。この場合、リポジトリはビジネス オブジェクトを返し、サービスはビジネス オブジェクトを処理し、コントローラはオブジェクトを適切に表示する方法しか知りません。詳細に:

  1. 人数、歴史、国名はすでに倉庫にあるので、そこから出てくるはずです。したがって、操作が同じエンティティに関するものである限り、リポジトリは完全なオブジェクトを返す必要があります。

  2. 複数のエンティティがプロセスに関与する場合、サービスは対応するリポジトリを呼び出してオブジェクトを構築する責任があります。

  3. 業務ルールに従って把握されるものも、サービス対象の仕事です。

  4. コントローラーは、サービスの単一のメソッドを呼び出して完全なオブジェクトを受け取り、それを表示します

このアプローチの利点は、オブジェクトのキャンセルを許可する方法に関するビジネス ルールなど、何かを変更することを決定したときに明らかになります。これはデータベースへのアクセスとは関係なく、アプリケーションの UI にも関係しないため、この場合に変更する必要があるのはサービスの実装だけです。このアプローチにより、リポジトリとコントローラーのコードを変更する必要なく、まさにそれを行うことができます。

于 2012-12-03T13:36:47.110 に答える