web-dev-qa-db-ja.com

MVC / MVPのデータベースと通信するのは誰ですか?

小さなアプリケーションを構築していて、ビジネスオブジェクトをデータベースに保存したいと考えています。

ビジネスオブジェクトと、ビジネスオブジェクトのコンテナーとして機能し、それらを作成および削除するメソッドを提供するモデルがあります。ビジネスオブジェクトの更新は、オブジェクトの属性を直接変更することによって行われます。また、ユーザーインターフェイスとユーザーインタラクションのためのプレゼンター、およびビジネスオブジェクトをデータベースに挿入/削除/更新する方法を知っているデータベースコミュニケーターも持っています。

ビジネスオブジェクトがcreateddeletedまたはalteredの場合は、データベースを常に更新したいと考えています。

最も簡単な方法は、モデルにデータベースコミュニケーターへの参照を与え、モデルでビジネスオブジェクトが作成/削除されたときに挿入/削除メソッドを呼び出し、ユーザーがビジネスオブジェクトを変更したときにプレゼンターから更新メソッドを呼び出すことです。ユーザーインターフェースを介して属性。

これは、MVP/MVCシナリオでデータベースを処理するための許容できる方法ですか、それとも通常、データベースとモデルレイヤーの間に密接な結合がありますか?その場合、ビジネスオブジェクトの1つが変更されたことをモデルに通知するためのベストプラクティスはありますか、それとも使用している言語で提供されるものを使用するだけですか?

5
Luca Fülbier

私はそれが2つの方法で行われるのを見てきました。

最初の方法は、CRUDメソッドを使用してすべてを行うことです。基本的には、作成、読み取り、更新、および削除について説明しています。ほとんどのオブジェクトリレーショナルマッパー(ORM)は、これらの4つの操作をサポートしています。

これを行う2番目の方法は、サービス層を提供することです。サービス層は、ビジネスオペレーションを具体化するメソッドを公開します。次に、これらのビジネスオペレーションを適切なCRUDメソッドに変換します。


この時点で、アーキテクチャについて少し説明しておくと便利です。

まず、MVCとMVPは主にUIについてであることに注意してください。つまり、ビジネスドメインで何が発生するかは特に気にしません。 UIは、表示するデータのビジネスドメインの性質と、ユーザーとのやり取りを反映することができます(多くの場合、反映します)が、[〜# 〜] m [〜#〜]MVCまたはMVPのodel部分。

Webページでは、MVCは通常次のようになります。

Model <--> Controller <--> View

モデルは、これらのパターンの「その他すべて」の部分であり、UIやルーティング、またはこれらのメカニズムのいずれにも関係しない部分です。 「薄いコントローラー、太ったモデル」という言葉を聞いたことがあるかもしれません。つまり、ビジネスロジックはコントローラーに入りません。同様に、ビューはほとんどの場合、データに関係しません。それは単なる表面です。これをデータで埋めるタスクは、通常、ViewModelオブジェクトに属します。ViewModelオブジェクトは、通常、モデルから派生したデータを使用してコントローラーで組み立てられます。

Model <--> Controller <--> ViewModel <--> View

ビューはデータを表示し、ユーザーからの入力データを受け入れます。インタラクティブな検証機能を備えている可能性がありますが、検証はクライアントで完全には実行されません(クライアントからのデータは信頼できないため)。検証はサーバーに委任され、コントローラー(主にスイッチヤードとして機能)は通常、そのような検証をモデルに委任します。

言い換えると、実際に役立つことを実行するほとんどのアプリケーションロジックは、可能な限りモデルに向かって押し戻されます。


これらすべての理由により、MV *アプリケーションは通常、内部のサービスレイヤーであっても、何らかのサービスレイヤーを備えています。

Database <--> ORM <--> Service Layer <--> Controller <--> View Model <--> View
|-------------- Model -------------|

サービスレイヤーにより、コントローラーはビジネスロジックについて考える必要がなくなり、データベースコミュニケーター(つまり、ORM)はCRUDについて考えるだけで済みます。

さらに読む
EAAのP:サービスレイヤー
Iアーキテクチャのファウラー

9
Robert Harvey