MVCでは、DAOはコントローラーまたはモデルから呼び出す必要があります


14

Controllerクラスから直接呼び出されるDAOに対するさまざまな引数と、ModelクラスからのDAOに対するさまざまな引数を見てきました。実際、MVCパターンに従っている場合、コントローラーはDAOと結合するべきではなく、Modelクラス内部からDAOを呼び出し、コントローラーがモデルクラスを呼び出す必要があるのは、なぜWebアプリケーションからモデルクラスを切り離し、RESTサービスがモデルクラスを使用するなどのさまざまな方法で機能を公開できるからです。

コントローラでDAO呼び出しを記述する場合、RESTサービスが機能を再利用することはできません。両方のアプローチを以下にまとめました。

アプローチ#1

  public class CustomerController extends HttpServlet {

    proctected void doPost(....)  {

            Customer customer = new Customer("xxxxx","23",1);
            new CustomerDAO().save(customer);

    }


 }

アプローチ#2

  public class CustomerController extends HttpServlet {

    proctected void doPost(....)  {

            Customer customer = new Customer("xxxxx","23",1);
            customer.save(customer);

    }


 }

 public class Customer {

   ...........

   private void save(Customer customer){

        new CustomerDAO().save(customer);

   }

}

-

モデルの定義は次のとおりです。

モデル:モデルは、アプリケーションドメインの動作とデータを管理し、その状態に関する情報の要求(通常はビューから)に応答し、状態を変更する指示(通常はコントローラーから)に応答します。

イベント駆動型システムでは、情報が変更されると、モデルはオブザーバー(通常はビュー)に通知して、反応できるようにします。

多くの場合、#1または#2を使用しているので、これについては専門家の意見が必要です。


コントローラーは、モデルからすべてをロードし、ビューに渡す必要があります。
jgauffin

提案アプローチ#2ですか?

1
「コントローラは、関連するビューにコマンドを送信して、モデルのビューの表示を変更できます(たとえば、ドキュメントをスクロールすることにより)。モデルにコマンドを送信して、モデルの状態を更新できます(ドキュメントの編集など)。.. emm ..コントローラーはデータを抽出したり、データを渡したりする必要がありますか?
メフィスト

回答:


31

私の意見では、MVCパターンと3層アーキテクチャを区別する必要があります。総括する:

3層アーキテクチャ:

  • データ:永続化されたデータ。
  • サービス:アプリケーションの論理部分。
  • プレゼンテーション:hmi、webservice ...

MVCパターンは、上記のアーキテクチャのプレゼンテーション層で行われます(webappの場合):

  • データ:...;
  • サービス:...;
  • プレゼンテーション:
    • コントローラー:HTTP要求をインターセプトし、HTTP応答を返します。
    • モデル:表示/処理するデータを保存します。
    • 表示:出力/表示を整理します。

典型的な HTTPリクエストのライフサイクル:

  1. ユーザーがHTTP要求を送信します。
  2. コントローラーはそれをインターセプトします。
  3. コントローラーは適切なサービスを呼び出します。
  4. サービスは適切なdaoを呼び出します。このdaoはいくつかの永続データを返します(たとえば)。
  5. サービスはデータを処理し、コントローラーにデータを返します。
  6. コントローラーはデータを適切なモデルに保存し、適切なビューを呼び出します。
  7. ビューはモデルのデータでインスタンス化され、HTTP応答として返されます。

「一般的なHTTPリクエストのライフサイクル」と呼ぶものはMVCではありません。また、DAOは単なるオブジェクトであり、ドメインロジックと永続性の間の相互作用/翻訳を容易にします。アクティブレコードの別の名前ではありません。また..モデルがプレゼンテーションの一部になったときから!?
メフィスト

1
@teresko 1)はい、MVCですが、3層アーキテクチャ内にあります。そうでない場合、なぜですか?2)あなたは正しかった、編集した。3)MVCパターン全体がプレゼンテーション層で行われるため。典型的な例:Spring MVC。モデルはキーと値のペアを含むマップのみです。SpringFuseもこの選択を行いました。
sp00m

2
ここで@ sp00mに同意する必要があります...彼の典型的なHTTPリクエストの説明はMVC Webアプリに対して正確であり、プレゼンテーション層の一部としてのモデルの位置付け(MVCの「M」として)も正しいです。n層のMVCアプリでは、「モデル」は通常、下の残りの層に対するプレゼンテーション層のファサードです。
エリックキング

8

モデル層から。

より正確に言うと、ドメインオブジェクトとストレージロジック抽象化の間の相互作用を管理するため、モデルレイヤーに含まれるサービスから。

コントローラーは、モデルレイヤーの状態の変更のみを担当する必要があります。DAOは永続化メカニズムの一部です。これは、ドメインビジネスおよびアプリケーションロジックの一部を構成します。コントローラーでDAOとの対話を開始すると、プレゼンテーションレイヤーでドメインロジックがリークします。


サービスレイヤーを使用するには、DDDパターンですか?私が間違っている場合は修正してください。MVCにサービスレイヤーはありますか?

あなたが持つことができます。サービスは、ドメインロジックをアプリケーションロジックから分離するために使用されます。これが必要になると、純粋なCRUDドメイン構造(アクティブレコード)から、ストレージロジックをドメインロジックから分離する何かに移行します。完全に実現されたモデルレイヤーには、永続性、ドメイン、アプリケーションの3つの論理的な分離があります。
メフィスト

3

公式のMVCパターンが何を要求しているかはわかりませんが、通常はコントローラーとDAOの間に「サービス」レイヤーを配置するのが好きです。コントローラはリクエストからデータを取得し、適切なサービスクラスに渡します。サービスクラスは、モデルクラスを返す1つ以上のDAOを呼び出す役割を果たします。これらのモデルクラスは、ビューレイヤーに送信するためにコントローラーに返送されます。複数のコントローラーが同じサービスレイヤーメソッドを利用できるため、サービスレイヤーを配置すると再利用に役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.