Идея состоит в том, что действие вашего контроллера запрашивает некоторый репозиторий для получения модели домена.Затем он передает эту модель предметной области в слой отображения, который отвечает за преобразование ее в модель представления, и, наконец, он передает модель представления в представление:
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, и вам придется реализовать настраиваемые привязки модели.