构建Asp.NetIEnumerableViewModels,并使用热切加载和自定义业务逻辑



型号:

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要么急于加载公司属性而自动绘制过程依赖于这些知识或者Automap为N个工作运行N个查询来获得公司——这显然是的糟糕做法

虽然解决方案可能是急于将公司财产加载到存储库,然后在不需要急切加载的情况下会发生什么。我们需要许多组合存储库方法来提供所有急切/懒惰的加载(潜在嵌套的急切负载等)场景?

VieModel的JobListingHasRecommendation属性也是一个问题,因为它需要涉及数据库查询的自定义业务逻辑来设置它,所以这需要为IEnumerable的所有成员按照JobListing来完成。在存储库调用之后在控制器内部执行此操作是很麻烦的,而在自动映射中执行此操作需要在自动映射构造中注入IRepository。

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

我的问题是,由于ViewModels存储的数据可能是复杂计算和数据库访问顺序集的结果,因此创建这些类型的ViewModels的IEnumerable的最佳实践是什么。

感谢

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

return dbContext.JobListings.Include(o=>o.Customers).ToList()//或者你想要装载的任何东西

最新更新