На самом деле построение модели вида должно выполняться в слое отображения. В основном ваше действие контроллера может выглядеть так:
public ActionResult Index()
{
SomeDomainModel model = repository.GetSomeDomainModel();
SomeViewModel vm = Mapper.Map<SomeDomainModel, SomeViewModel>(model);
return View(vm);
}
Модель представления определяется в проекте MVC, поскольку это класс, специально разработанный для удовлетворения требований данного представления.
Метод Mapper.Map<TSource, TDest>
, который я показал в своем ответе, происходит от AutoMapper , который я использую в своем проекте, но вы можете определить любой пользовательский слой отображения, который вам нравится.
Слой сопоставления также должен быть частью проекта MVC, поскольку он должен знать как модели вашего домена, так и модели представления для выполнения сопоставления.
Что касается уровня обслуживания, вы можете использовать его, когда у вас есть несколько сложных бизнес-операций, которые могут состоять из нескольких простых вызовов репозитория. Но некоторые могут спорить о существовании сервисного уровня вообще. Я думаю, что оба подхода имеют свои плюсы и минусы, которые необходимо оценивать при проектировании системы, и, что наиболее важно, учитывать конкретный контекст и сценарий, который вы разрабатываете.