MVCシステムでは、データベースの永続化コードはどこにあるべきですか?


21

データベースに情報を保持するための複数の構成を見てきました。一般的に、私の世界では3つのタイプのデザインが一般的です。

  • コントローラーが永続性を管理します
  • モデルは永続性を管理します
  • サードパーティのライブラリが永続性を管理します。通常、モデルに何らかの種類の注釈が​​必要です。

概念的に、MVCアーキテクチャと最も互換性があり、互換性のある構成はどれか(もしあれば)疑問に思っていますか?

(リストにない場合は、回答の一部として簡単な概要/概要を教えてください)

回答:


13

2番目と3番目のオプションは同じです。MVCのMはデータモデルではなく、ドメインモデルです。これには、直接行われるかORMを介して行われるかに関係なく、永続性が含まれ、両方とも完全に正しいです。

コントローラーはサイトのフローを管理し、(サービスレイヤーを介して)処理するドメインにデータを渡す必要があるため、そこから永続化するのは間違っています-少なくとも意味的に不快です。


2
ある程度は同意しません。永続性の具体的な利用はアプリケーションロジックであるため、ドメインレイヤーではなくアプリケーションレイヤーに属します。ドメイン層(ドメインモデルを含む)は、カジュアルビジネスプログラムの永続性について無知でなければなりません。コントローラーはオーケストレーターです。(データ)サービス、UI、およびドメインモデルを調整できます。
ファルコン

1
@Falcon:コントローラーは、データベースからデータをロードし、データベースに永続化するタイミングを制御する必要がありますが、モデルにそうするように指示しても大丈夫です。ORM(標準または独自のロール)を使用することは、通常、モデルにORMに委任するロード/保存を指示することを意味します。別の方法としては、コントローラがORMに、ロードするモデルクラス(選択条件付き)または保存するモデルインスタンスを渡すものをロード/保存するように指示することもできます。どちらにしても、実際のロード/保存はモデルに完全に結び付けられます。
マルジャンヴェネマ

@Marjan Venema:はい、同意しますが、問題はそのコードがどこにあるべきかということです。私は、モデルを可能な限り永続性に無知に保ち、ドメインエンティティの動作と相互作用のみをモデル化するよう努めています。それ以外はすべてアプリケーション層に存在します(私のモデルのアプリケーションなので)。マッピング情報/データアクセスは、ドメインモデルから完全に切り離されており、バージョン管理(アップグレード/ダウングレード)の面倒も見ることができます。データアクセスのアプリケーションは、アプリケーション層(サービス、リポジトリなどを含む)にも存在します。
Falcon

@Falcon:はい、それはそれを行う良い方法であり、過去に別のマッピングクラスを使用してそれを行った方法です。ただし、拡張RTTI(Delphi)とリフレクション(.Netなど)の出現により、これらをビジネスオブジェクトモデルの属性の注釈と組み合わせて使用​​して、すべてを取得し、コードフックへのオーバーロード、 /またはデータベースのバージョン管理を行うために特別にコーディングされた初期化クラス。
マルジャンヴェネマ

5

現実的には、MVCはほとんどがUI実装パターンであるため、問題はやや議論の余地があります。ただし、実際には2つの大きな画像オプションしかありません。通常、コントローラーは、1)何らかのサービスレイヤーまたは2)Active Recordパターンのいずれかを使用して、モデル内のエンティティをロードまたは保存するリクエストをディスパッチします。

私の個人的な好みは、集約ルートエンティティのリポジトリ抽象化を使用することですが、その具体的な実装は、何らかのORM、または軽量のDAO、またはアプリケーションにとって意味のある非リレーショナルストアのAPI。

Active Recordパターンは、通常、何らかの基本クラスがストアへのマッピングを管理することを意味しますが、モデルには永続性に対する責任があることを意味するため、モデルは実際には直接関与しません。

基本的に、コントローラーは、それがリポジトリー、UnitOfWork実装、またはエンティティーのSaveメソッドの呼び出しであるかどうかにかかわらず、オブジェクトを永続化するためにリクエストをディスパッチします。リポジトリを使用している場合、モデルオブジェクトは永続性を無視します。


3

MVC(モデルビューコントローラー)システムでは、モデルにデータが含まれています。だから、データベースの永続性はそこにあるべきだと思います。


2

私が見たほとんどの高レベルMVCサンプルにinfrastructureは、実際のデータベース実装コード(つまり、NHibernate、EF、Linq、またはデータレイヤーが何であれ)への個別のレイヤーがあります。 「ドメイン」層)には、データサービスを定義するインターフェイスがあります。


0

MVCの標準的なプラクティスは、M(odel)レイヤーにデータ構造と永続性を含めることです。

モデル層には、アプリケーションで使用するクラス(POCOなど)だけが含まれているわけではありません。それらには、それらのクラスのリポジトリが含まれます。

例は、データクラスインスタンスの房があるリポジトリです。

Clients repository

AllClients()
RecentClients()
ClientByID(int id)

モデルドメインをより良く整理でき、さまざまな方法でデータにアクセスできますが、データ/モデルレイヤーはコンパクトで堅牢です。

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