誰かがもっと役立つ答えを書いている間、私はあなたのポイントにすぐに対処します。
Model
表示したいデータです。
多くの場合、オブジェクトリレーショナルマッピングを使用して、ほとんどのビジネスオブジェクトクラスがデータベーステーブルに対応し、手動でクエリを作成する必要がないようにします。
Entity Framework、NHibernate、(現在は死にかけている)LINQ to SQLなど、利用可能なORMソリューションはたくさんあります。
Dapperと呼ばれる素晴らしいマイクロORMもあります。これは、より大きなフレームワークがソリューションに対して不必要に肥大化していると感じた場合に役立ちます。
それらの違いについて必ず学んでください。
DALは、自分自身をロードする方法を「知っている」クラスよりも.NETで慣用的です。
(実際には、ソリューションは両方のアプローチを組み合わせたものになる可能性が非常に高くなります。重要なのは、いつものように、バランスを保つことです。)
私のアドバイスは、ORMで許可されている限り、また呼び出し元のコードに余分なレベルの複雑さが加わらない限り 、モデルを古いCLRオブジェクトのままにしておくことです。
これらのオブジェクトは、可能な限り(そして賢明な場合、どのルールにも例外があります!)、特定のデータベースまたはORM実装に関連付けるべきではありません。
必要に応じて、コードを別のORMに移行するだけで、データアクセス層を書き換えることができます。
ただし、これがDALを分離する主な理由 ではないことを理解する必要があります。
プロジェクトの途中でORMを変更する可能性はほとんどありません。ただし、最初の選択が目的に適さない場合や、突然10万人のユーザーを獲得し、ORMで処理できない場合を除きます。最初にこれを最適化することは、最適化するヒットのほんの一部でも引き付けることができる優れた製品を作成することからあなたをそらすので、まったく愚かです。(免責事項:私は以前にこの道を歩いたことがあります。)
むしろ、DALの利点は、データベースアクセスが常に明示的になり、それを実行したい特定の場所に制限されることです。たとえば、表示するモデルオブジェクトを受け取ったビューは、データベースから何かをロードしようとはしません。これは、実際には、コントローラーの仕事だからです。
また、一般的に、ビジネスロジック、プレゼンテーションロジック、データベースロジックなどを分離することもできます。あまりにも多くの場合、それはより良い、バグの少ないコードになります。また、データベースからロードされているオブジェクトに依存するコードを単体テストするのは難しい場合があります。一方、「偽の」メモリ内データアクセス層を作成することは、LINQでは簡単です。
ビュー内で呼び出された場合でも、外出先で関連オブジェクトをロードする多くのORMによって生成されるレイジープロパティなど、このルールには例外があることに注意してください。したがって、重要なのは、データアクセスを許可する時期とその理由を十分な情報に基づいて決定する必要があるということです。シンタックスシュガーは役立つかもしれませんが、チームがORMから20,000個のオブジェクトをロードすることのパフォーマンスへの影響について知らない場合、それは問題になります。
ORMを使用する前に、内部でどのように機能するかを学びます。
Active RecordスタイルのオブジェクトとDALのどちらを選択するかは、ほとんどの場合、好み、.NETの一般的なイディオム、チームの習慣、およびDALを最終的に置き換える必要がある可能性の問題です。
最後に、ViewModel
sは別の種類の獣です。
次のように考えてみてください。
- ビューには、よりも洗練されたロジックを含めるべきではありません
if-then-else
。
- ただし、多くの場合、物事を表示する際にいくつかの洗練されたロジックがあります。
ページネーション、並べ替え、1つのビューでのさまざまなモデルの組み合わせ、UIの状態の理解について考えてください。
これらは、ビューモデルが処理できる種類のものです。
単純なケースでは、いくつかの異なるモデルを1つの「ビューモデル」に結合するだけです。
class AddOrderViewModel {
// So the user knows what is already ordered
public IEnumerable<Order> PreviousOrders { get; set; }
// Object being added (keeping a reference in case of validation errors)
public Order CurrentOrder { get; set; }
}
モデルは単なるデータであり、コントローラーはデータを組み合わせて、ビューモデルに表示されるデータを記述するためのロジックを導入し、ビューはビューモデルをレンダリングするだけです。
ビューモデルは一種のドキュメントとしても機能します。彼らは2つの質問に答えます:
- ビューで使用できるデータは何ですか?
- コントローラでどのようなデータを準備する必要がありますか?
オブジェクトを渡しViewData
、名前と型を記憶する代わりに、ジェネリックビューを使用ViewModel
して、静的に型付けされ、IntelliSenseで使用できるプロパティにオブジェクトを配置します。
また、階層を作成すると便利な場合がViewModel
あります(ただし、極端にしないでください)。たとえば、サイト全体のナビゲーションがブレッドクラムから別のものに変更された場合、ベースビューモデルのプロパティ、それを表示するための部分ビュー、およびベースコントローラでそれを構築するためのロジックを置き換えるだけでかまいません。それを賢明に保ちなさい。