这个想法是你的控制器动作查询某个仓库来获取一个领域模型。然后它将这个领域模型传递给映射层,负责将其转换为视图模型,最后将视图模型传递给视图:
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 操作中没有一个无参构造函数,那么默认的模型绑定器将无法工作,你将不得不实现自定义的模型绑定器。