コントローラー、ビュー、およびコアで使用できるビューモデルがあります。コアは別のプロジェクトですが、コントローラーとビューは Web プロジェクトにあります。ViewModel を配置するのに最適な場所はどこですか?それは Web プロジェクトにありますか、それとも Core にありますか?それとも View Model 専用の別のプロジェクトを作成する必要がありますか?
3 に答える
Controllers、View、およびCoreで使用できるビューモデルがあります。
いいえ。コアでは使用していません。Google「関心の分離」。ビューモデルの責任は、ビューでモデル(コアプロジェクト)を表すことです。他の目的には使用しないでください。ビューモデルについてここに書いています:http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/
モデル(コアプロジェクト)からすべてを取得し、適切なビューモデルを作成するのは、コントローラーの責任です。
ビューモデルをコアで使用できるように配置すると、変更する理由が複数あり、単一責任の原則(5つのSOLID原則の1つ)が破られます。つまり、アプリケーションのいくつかの部分は、行うすべての変更の影響を受け、小さな回避策や迅速な修正につながる可能性があり、1年後にはメンテナンスの悪夢になります。
アップデート
AutoMapperの使用例:
public class FlairController
{
public FlairController(IYourServiceOrRepository repos)
{
}
public ActionResult Details(int id)
{
SomeCoreObject entity = _repos.Get(id);
FlairViewModel model = new FlairViewModel();
Mapper.Map(entity, model);
return View(model);
}
}
サンプルコード(コメント内)は、マッピングフレームワークがない場合のメソッドの外観です。
ビュー モデルは通常、UI 形式のデータを持つモデルのラッパーです。おそらく、モデル クラスをコア プロジェクトに、ビュー モデル クラスを Web プロジェクトに保持する必要があります。
View Model クラスのコンストラクターは、モデル クラスのインスタンス (およびビューを設定するために必要なその他のオブジェクト) を受け取り、適切なビュー データを生成できます。たとえば、モデルに DateTime オブジェクトがある場合、ビュー モデルには、表示する形式の DateTime を含む対応する String プロパティを含めることができます。
ViewModel はビューに固有のものであるため、通常は UI プロジェクトの下に ViewModel フォルダーを作成し、そこに保持します。
ViewModel とエンティティ モデルの間でデータをブリッジするために、別のサービス レイヤー (別のプロジェクト) を作成します。私のコントローラー アクション メソッドは、ViewModel オブジェクトを使用してサービス レイヤーを呼び出します。