私は、コントローラ、ビュー、およびコアで使用できるビューモデルを持っています。コアは、コントローラとビューがWebプロジェクトにある間は、別個のプロジェクトです。 ViewModelを置くのに最適な場所はどこですか、それはWebプロジェクトかCoreかですか、View Modelのみの個別のプロジェクトを作成する必要がありますか?ViewModelを置く場所
答えて
ビューモデルは、通常、UI形式のデータを持つモデルのラッパーです。おそらく、あなたのモデルプロジェクトをWebプロジェクトのCoreプロジェクトとビューモデルクラスに入れておくべきでしょう。
View Modelクラスのコンストラクタは、モデルクラス(ビューを生成するために必要なその他のオブジェクト)のインスタンスを取得し、適切なビューデータを生成できます。たとえば、モデルにDateTimeオブジェクトがある場合、表示モデルには、表示する形式のDateTimeを含む対応するStringプロパティを含めることができます。
ViewModelsはビュー固有のものなので、私は通常、自分のUIプロジェクトの下にViewModelフォルダを作成してそこに保持します。
私は自分のviewmodelsとエンティティモデルの間でデータを橋渡しするために別々のサービス層(別のプロジェクト)を作成します。 My ControllerのActionメソッドは、ViewModelオブジェクトを使用してサービスレイヤを呼び出します。
実際に私たちは同じデザインを持っています。あなたはViewModelを返すサービス層とコントローラのサンプルコードを送ってください。私が正しく理解するために。 – user335160
私は、コントローラ、ビュー、およびコアで使用できるビューモデルを持っています。
いいえコアでは使用していません。 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);
}
}
(コメントで)あなたのコード例では、方法は、マッピングフレームワークなしのようになります方法です。
ここに私のプロジェクト構造はあります ウェブサイト - 閲覧 コントローラ - すべてのコントローラはここにあります(ここでは混乱します) コア - 自動マッパー構成、マッパークラス、ModelViewマッピング、およびサービス(ViewModelはここを使用してデータが必要です) DataAccess-リポジトリクラス EFによって生成されたモデル – user335160
ビューモデルとビューモデルとコアモデル間の自動設定は、コアが何も認識していないため、UI(MVC3プロジェクト)に配置する必要がありますUIレイヤーであなたのサービスでは、HTMLを表示するのに特化されたビューモデルを使用すべきではありません – jgauffin
あなたが言及したアプローチに関するサンプルコードをここに入れてください。実際には私は非常に混乱しています。お使いのコントローラがこのサンプルコードリターンビュー( ビュー、 新しいFlairViewModel { ディナーを= dinners.ToList()、 にLocationName = string.IsNullOrEmpty(location.City)は、ある "あなたは":?String.Formatの( "{ 0}、{1} "、location.City、location.RegionName) } ); – user335160
コアでビューモデルを使用するにはどうすればよいですか? Webプロジェクトクラスを参照する必要がありますか? – user335160
その逆です。 Webプロジェクトは、コアプロジェクトを参照します。私は自分の答えを更新しました –
ViewModelとモデルをマップするためにオートマッペを使用したので、私は今混乱しています。コンストラクタでモデルをインスタンス化すると、Automapperは必要ありません。 – user335160