Модель:
public class Company
{
public string Name {get;set;}
}
public class JobListing
{
public string Title {get;set;}
public Company Company {get;set;}
public bool JobListingHasRecommendation {get;set;}
}
ViewModel:
public class JobListingVM
{
public string Title {get;set;}
public string CompanyName {get;set;}
public string TitleAtCompany
{
get
{
return string.Format("{0} at {1}", Title, CompanyName);
}
}
}
Метод репозитория:
public IEnumerable<JobListing> getAllJobs()
{
return dbContext.JobListings;
}
Действие контроллера:
public ActionResult Index()
{
var jobs = repository.getAllJobs();//jobs is now disconnected from the dbcontext
//let's say there are a thousands of jobs (and we will be paging)
//now we use some Automap like magic to convert the IEnumerable<JobListing> into
//IEnumerable<JobListingVM>
}
Проблема в том, что getAllJobs должен либо загрузить свойство Company
и процесс Automap опирается на эти знания
или Automap выполняет N запросов для N заданий, чтобы получить компанию - и это явно плохая практика
Хотя решение этой проблемы, возможно, состоит в том, чтобы загружать свойство Company в
то, что происходит в случаях, когда никто не хочет загружать.
Нам нужно много комбинаторных методов репозитория, чтобы обеспечить полную / ленивую нагрузку (с
сценарии потенциально вложенной нагрузки и т. д.)
Свойство JobListingHasRecommendation в VieModel также является проблемой, поскольку для его установки требуется настраиваемая бизнес-логика, включающая запросы к базе данных, поэтому это необходимо сделать для каждого элемента JobListing для всех членов IEnumerable. Выполнение этого в контроллере после того, как вызов репозитория является беспорядочным, а выполнение внутри автопреобразования требует IRepository, введенного в конструкцию Automapping.
Отображение моделей в ViewModels не так просто, как все примеры автокартирования, которые я вижу. Я редко вижу пример, когда список моделей отображается в список ViewModels, и каждый элемент JobListingHasRecommendation ViewModel должен рассчитываться индивидуально. Здесь возникают проблемы с производительностью и архитектурой, так как сервису автоматического сопоставления теперь также необходим доступ к базе данных ...
У меня такой вопрос - поскольку ViewModels хранит данные, которые могут быть результатом сложных вычислений и последовательного набора обращений к базе данных, что является наилучшей практикой для создания IEnumerable из этих типов ViewModels.
Спасибо