2009-03-25 22 views
2

私は現在、WebFormsからMVCにいくつかの小さな個人用Webサイトを変換中です。既存のサイトでは、データベーススキーマは安定していますが、適切なデータ/ビジネスモデル/レイヤーを構築するための時間は本当にかかりませんでした。 aspxページはすべて、便宜のために必要に応じて作成されたさまざまなビューとストアドプロシージャを使用して、データベースに直接話しました。 MVCでは、LINQ to SQLやEntity Frameworkのようなものを使用してアプリケーションの適切なデータモデルを構築するために、「正しく実行する」ことを試みています。ASP.NET MVCのモデル設計アドバイス

私の質問は、データモデルを構築するためにどのような目標を持っていなければならないかを中心にしています。私は様々なパターン関連の記事を読んできましたが、最終的にはその答えが自分のデータの特性に依存する可能性が高いことに気付きました。しかし、一般的には、できるだけ多くのデータベースを含むより大きなモデルを構築して、与えられたテーブルのセットと対話する唯一の方法があるはずですか?または、ビューに必要なデータとアクセスのみを含むMVCビューごとに、より小さなカスタムモデルを作成する必要がありますか?

+0

本当に面白い質問です。 +1 – User

答えて

2

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

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

モデルを階層構造にすることができます。そのため、ID、名前、設定などの一般的なプロパティが各モデルに存在する可能性があります。

ファット拡張モデルは、フレームワークが自動的にプリロードされたユーザーのプリファレンス、ユーザーの役割、アクセス権などに基づいて、多くのものを実行するエンタープライズアプリケーションに適しています。小さな個人用プロジェクトの場合、きれいにしてください。それはまた保護です。不必要なデータをモデルに入れないことで、誤って誤ったエントリを表示したり、フォームを送信しても誤って他のデータを上書きしたりすることはありません。

+0

私はこれがコンセンサスのように思えるのですが、これは私が傾けている解決策だからです。より多くのクラスがより複雑になり、保守性が低いと疑問に思っていました。 –

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>>(); %> 

私はMVC Contribのを使用していた/ビュー・オブジェクト/ 1/

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

/ViewChild/1/1/

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

注意は、私は非常にこれらをお勧めの機能を入力しました。

0

通常、データベースの包括的なドメインモデルが1つあります。小さなアプリケーションの場合は、サービスレイヤーまたはコントローラーのドメインモデルを(変更/追加/削除/ etc。)することができます。

ただし、ビューの場合、プレゼンテーションオブジェクトを使用してビューをより簡単に維持できます。これらは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がその例です。