這個想法是,您的控制器操作查詢某個存儲庫以獲取域模型。然後它會將這個領域模型的映射層負責將其轉換爲一個視圖模型,最後它通過視圖模型到視圖:
public ActionResult Index(int id)
{
ProductInfo product = repository.GetProductInfo(id);
ProductViewModel viewModel = Mapper.Map<ProductInfo, ProductViewModel>(product);
return View(viewModel);
}
,你甚至可以使你的控制器苗條通過引入自定義動作濾波器將自動攔截模型在OnActionExecuted
事件並調用到映射層與相應的視圖模型來替代它,以便你的控制器操作現在變爲:
[AutoMapTo(typeof(ProductViewModel))]
public ActionResult Index(int id)
{
ProductInfo product = repository.GetProductInfo(id);
return View(product);
}
當然現在視圖是強類型到ProductViewModel:
@model ProductViewModel
...
由您來執行Mapper.Map<TSource, TDest>
方法。如果你不想自己實現它,你可以下載AutoMapper已經有這種方法給你。
映射層是MVC應用程序的一部分。它必須意識到來自服務層的域模型和MVC應用程序中定義的視圖模型,以便能夠執行映射。
請勿在視圖模型中使用構造函數(默認無參數的構造函數)。如果視圖模型在POST操作中沒有無參數構造函數,那麼默認模型聯編程序將會窒息,您將不得不實現定製模型聯編程序。
看起來像你在那裏回答自己的問題。 – dice 2012-02-20 16:34:52
很高興你問這個問題,我很驚訝沒有人有+1這個問題,就像他們今天做的那樣。我一直玩弄各種建議和建議的做法,但Darins的答案是正確的,我的街道,很好的問題,很好的答案。 – LenPopLilly 2012-03-03 16:07:19