使用急切加载和自定义业务逻辑构建Asp.Net IEnumerable ViewModels

时间:2012-03-07 18:53:57

标签: asp.net-mvc-3

型号:

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;}
}

视图模型:

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个查询以获得公司 - 这显然是不好的做法

虽然解决这个问题的方法可能是急切地加载公司财产 然后在一个人不想要急切加载的情况下会发生什么。 我们需要许多组合存储库方法来提供所有急切/延迟加载(使用 潜在的嵌套急切负载等)场景?

VieModel的JobListingHasRecommendation属性也是一个问题,因为它需要包含数据库查询的自定义业务逻辑来设置它,因此需要为每个JobListing完成IEnumerable的所有成员。在存储库调用之后在控制器内部执行此操作很麻烦并且在自动化内部执行此操作需要将IRepository注入到Automapping构造中。

模型到ViewModels的映射并不像我看到的所有自动化示例那样简单。我很少看到一个示例,其中模型列表映射到ViewModel列表,并且每个ViewModel的JobListingHasRecommendation必须单独计算。这里存在性能和体系结构问题,因为自动化服务现在还必须具有数据库访问权限......

我的问题是 - 由于ViewModel存储的数据可能是复杂计算和连续数据库访问集的结果,因此创建这些类型的ViewModel的IEnumerable的最佳做法是什么。

由于

1 个答案:

答案 0 :(得分:0)

通过Include()指定您想要加载的内容,并返回ToList()

return dbContext.JobListings.Include(o=>o.Customers).ToList(); //or whatever you want to eager load