Создание Asp.Net IEnumerable ViewModels с энергичной загрузкой и настраиваемой бизнес-логикой - PullRequest
1 голос
/ 07 марта 2012

Модель:

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.

Спасибо

1 Ответ

0 голосов
/ 07 марта 2012

Укажите, что вы хотите загружать с помощью Include (), и верните ToList ()

return dbContext.JobListings.Include(o=>o.Customers).ToList(); //or whatever you want to eager load
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...