型号:
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()//或者你想要装载的任何东西