4

私は ASP の世界全体に不慣れで、C# MVC3/EF4 プロジェクトを構築することで足を濡らしています。モデルとビュー モデルで大量のコードを複製しないようにするのは難しいと感じています。オブジェクト Foo を考えてみましょう。Foo で次のことを行う必要があります。

  1. Foo 型のレコードをデータベースに保存します。
  2. ユーザーが個々の Foo のレコードを検索できるようにします (Foo のインスタンスをビューに渡します)。
  3. ユーザーが Foo の新しいインスタンスを作成できるようにします (Foo のインスタンスをフォームに渡します)。

タイプ Bar もあるとしましょう。Bar には Foos のリストが含まれます。ここには 2 つの要件があります。

  1. ユーザーはバーのリストを表示できます。
  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 リソースを積極的に解放できるようにしたいと考えています。目標を達成するための最良の方法は何ですか?

4

1 に答える 1

0

私のアドバイスは、EF エンティティ クラスでデータ注釈を使用しないことです。代わりに、流れるような API を試してください。モデルクラス自体から永続性の問題を取り除きます。まったく別のライブラリでモデルビルダーのものを定義することもできます.

重複したプロパティを持つことに関しては、プロパティは安価です。

public string MyProp { get; set; }

コードはそれほど多くなく、お気づきかもしれませんが、ビューモデルとエンティティは必ずしも互いに正確に複製されている必要はありません。たとえば、[HiddenInput] をビューモデルに適用して、それを としてレンダリングするにはどうすればよいでしょう<input type="hidden" />か? それをエンティティに適用しますか?なんで?ビューモデルに属します (名前空間は System.ComponentModel.DataAnnotations ではなく System.Web.Mvc です)。

検証中にエラー メッセージを複製する限り (MVC レイヤーと EF レイヤーを個別に検証する場合)、resx リソースを使用できます。

db リソースを解放する限り、EF に管理させます。HttpContext ごとに 1 つの DbContext インスタンスを保持するのが最善だと思います。ファクトリ、OnActionExecuting アクション フィルター、Application_BeginRequest、IoC コンテナーなどを使用して開くことができます。次に、OnResultExecued、Application_EndRequest などの間にコンテキストを破棄します。物事をシンプルに保ちます。

于 2012-07-20T07:42:08.303 に答える