2

現在、いくつかの小さな個人 Web サイトを WebForms から MVC に変換中です。既存のサイトでは、データベース スキーマはしっかりしていますが、適切なデータ/ビジネス モデル/レイヤーを構築するのに時間をかけたことはありませんでした。aspx ページはすべて、利便性のために必要に応じて作成されたさまざまなビューとストアド プロシージャを使用して、データベースと直接対話していました。MVC では、彼らが言うように、LINQ to SQL や Entity Framework などを使用して、適切なデータ モデルまたはアプリケーションのモデルを構築しようとしています。

私の質問は、データ モデルを構築するためにどのような目標を設定する必要があるかについてです。さまざまなパターン関連の記事を読みましたが、最終的にはデータの特性によって答えが変わる可能性が高いことに気付きました。しかし、一般的に、特定のテーブル セットを操作する方法が 1 つだけになるように、できるだけ多くのデータベースを網羅するより大きなモデルを構築する必要がありますか? または、ビューが必要とするデータとアクセスのみを含む MVC ビューごとに、より小さなカスタム モデルを構築する必要がありますか?

4

3 に答える 3

2

または、ビューが必要とするデータとアクセスのみを含む MVC ビューごとに、より小さなカスタム モデルを構築する必要がありますか?

これはおそらく良いでしょう。

モデルを階層に固定できることを忘れないでください。これにより、ID、名前、設定などの共通のプロパティを各モデルに含めることができます。

ファットな拡張モデルは、プリロードされたユーザー設定、ユーザー ロール、アクセス権などに基づいてフレームワークが自動的に多くの処理を行うエンタープライズ アプリケーションに適しています。小規模な個人プロジェクトの場合は、モデルを小さくクリーンに保つように努めたほうがよいでしょう。それはお守りでもあります。不要なデータをモデルに入れないようにすることで、ビューが誤って間違ったエントリを表示したり、フォームを送信しても他のデータが誤って上書きされたりすることがなくなります。

于 2009-03-25T17:00:17.847 に答える
0

通常、データベースには 1 つの包括的なドメイン モデルがあります。小さなアプリの場合は、サービス層またはコントローラーでドメイン モデルを使用 (変更/追加/削除/など) できます。

ただし、ビューについては、プレゼンテーション オブジェクトを使用して、ビューの保守を容易にすることができます。これらは、DTO またはビュー モデル オブジェクトと呼ばれることもあります。基本的に行うことは、ビューに入力するために必要なモデルからのすべてのデータを含むオブジェクトを作成することです。

例えば:

モデルには次のものが含まれる場合があります。

public class Car() 
{
  public string Model;
}

public class Driver()
{
  public string Name;
}

ビューで車の名前とモデルを出力する必要があり、車とドライバーの両方のモデル オブジェクトをビューに渡す必要があります。

コントローラーからビューに 2 つのモデル オブジェクトを直接送信するのではなく、必要なデータだけを含むオブジェクトを作成できます。

public class CarAndDriverViewModel()
{
  public string CarMake;
  public string DriverName;
}

ドメイン データからこのオブジェクトを設定し、それをビューに渡します。ビューは次のようになります。

model.DriverName + ": " + model.CarMake

これで、遅延読み込みの問題や、モデルの特殊性に対処するための複雑なビュー ロジックについて心配する必要がなくなりました。これらのビュー モデル オブジェクトを作成するのは手間がかかりますが、ビューをきれいに保つのに非常に役立ち、データをビューに送信する前に書式設定を行う簡単な方法を提供します。

調べたい場合は、ビュー モデルの作成を自動化するために使用できるプロジェクトと規則があります。AutoMapperはその一例です。

于 2009-03-25T17:09:11.413 に答える
0

現在のシステム内の実際のデータ ロジックを表すモデルを使用し、ビューが必要とする次のようなモデルの一部をコントローラーに返します。

コントローラ:

public ActionResult index()
{
    var ListOfObjects = DataHelper.GetAll();
    ViewData.Add(ListOfObjects);
    return View();
}

public ActionResult ViewObject(int id)
{
    var Object= DataHelper.GetObject();
    ViewData.Add(Object);
    return View();
}

public ActionResult ViewObjectChild(int Objectid, int ChildId)
{
    var Child= DataHelper.GetChildObject(Objectid, ChildId);
    ViewData.Add(Child);
    return View();
}

ビューで

/

<%  var myListOfObjects = ViewData.Get<IList<Object>>(); %>

/ViewObject/1/

<%  var myobject= ViewData.Get<Object>(); %>

/ViewChild/1/1/

<%  var myChild = ViewData.Get<Child>(); %>

注 MVC Contrib 型付き関数を使用しました。これらを強くお勧めします。

于 2009-03-25T16:58:26.523 に答える