私は ASP の世界全体に不慣れで、C# MVC3/EF4 プロジェクトを構築することで足を濡らしています。モデルとビュー モデルで大量のコードを複製しないようにするのは難しいと感じています。オブジェクト Foo を考えてみましょう。Foo で次のことを行う必要があります。
- Foo 型のレコードをデータベースに保存します。
- ユーザーが個々の Foo のレコードを検索できるようにします (Foo のインスタンスをビューに渡します)。
- ユーザーが Foo の新しいインスタンスを作成できるようにします (Foo のインスタンスをフォームに渡します)。
タイプ Bar もあるとしましょう。Bar には Foos のリストが含まれます。ここには 2 つの要件があります。
- ユーザーはバーのリストを表示できます。
- ユーザーが特定のバーをクリックすると、そのすべての Foos が表示されます。
したがって、私の基本的なオブジェクトのスケッチは次のようになります。
class Foo
{
string FooName;
int Id;
}
class Bar
{
List<Foo> FooList;
int Id;
string Baz;
}
しかし、さまざまなビューについて考え始めると、混乱し始めます。
- ビューには、データ メンバーへの書き込みアクセス権がないようにする必要があります。
- Bars のリストを受け取るが、Bar.FooList を気にしないビューが 1 つあります。リソース管理についてもうまくいき、DbContext をできるだけ早く閉じたいとしましょう (つまり、オブジェクトがメモリに置かれた後、ビューをレンダリングする前に)。バーのリストを渡すだけで、デザイナーが誤って FooList にアクセスしようとすると、実行時エラーが発生します。うん!
わかりました。データメンバーのみを読み取るビューごとに個別の ViewModel を作成するだけです。問題ありません。
- ただし、データベース モデルとフォーム モデルの両方に、必要なフィールド、文字列の最大長などを示す DataAnnotations を添付する必要があります。フォーム モデルとデータベース モデルを別々に作成すると、これらすべての注釈を複製する必要があります。うん!
つまり、それが私のアーキテクチャ上のジレンマです。ビューを、アクセスするはずのデータの読み取りのみに制限する簡潔なビュー モデルが必要です。あちこちでデータ注釈を繰り返すのは避けたいです。そして、できるだけ早く DB リソースを積極的に解放できるようにしたいと考えています。目標を達成するための最良の方法は何ですか?