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