Asp.net mvc 3 使用即时加载和自定义业务逻辑构建Asp.Net IEnumerable ViewModels
型号: 视图模型:Asp.net mvc 3 使用即时加载和自定义业务逻辑构建Asp.Net IEnumerable ViewModels,asp.net-mvc-3,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 JobListingV
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 getAllJobs()
{
返回dbContext.JobListings;
}
控制器操作:
public IEnumerable<JobListing> getAllJobs()
{
return dbContext.JobListings;
}
public ActionResult Index()
{
var jobs=repository.getAllJobs();//作业现在已从dbcontext断开连接
//假设有数千个工作(我们将进行分页)
//现在我们使用一些类似自动映射的魔法将IEnumerable转换为
//数不清
}
问题是getAllJobs必须加载公司属性
自动映射过程依赖于这些知识
或者Automap为N个职位运行N个查询以获得公司-这显然是一种糟糕的做法
而解决这个问题的方法可能是在
那么,当一个人不想要急切的负载时,会发生什么情况呢。
我们需要许多组合存储库方法来提供所有的急/缓加载(使用
潜在嵌套的紧急负载等)场景
VieModel的JobListingHasRecommension属性也是一个问题,因为它需要涉及db查询的自定义业务逻辑来设置它,因此需要为IEnumerable的所有成员按JobListing进行设置。在存储库调用之后在控制器中执行此操作是混乱的,在自动映射中执行此操作需要在自动映射构造中注入一个IRepository
模型到ViewModels的映射不像我看到的所有自动映射示例那样简单。我很少看到模型列表映射到ViewModels列表的示例,每个ViewModel的JobListingHas建议都必须单独计算。这里存在性能和体系结构问题,因为自动映射服务现在还必须具有数据库访问权限
我的问题是-既然ViewModels存储的数据可能是复杂计算和连续数据库访问的结果,那么创建这些类型ViewModel的IEnumerable的最佳实践是什么
谢谢通过Include()指定要加载的内容,并返回ToList() 返回dbContext.JobListings.Include(o=>o.Customers.ToList()//或者任何你想要的东西
您是否尝试过只用于查询轻型模型的存储库?基本上,存储库将直接返回视图模型(或其部分)。存储库将负责查询orm并仅获取所需的列。您当前的存储库方法不起任何作用,只能选择所需的数据,然后这些数据将直接映射到视图模型。MikeSW-如何确定同一实体的许多不同子选择(或包含)的返回类契约?您可以使用select和include be方法参数(select使用动态linq,include参数使用EF string include功能),但是对于这种灵活的select repo方法,返回类型是什么?
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>
}
return dbContext.JobListings.Include(o=>o.Customers).ToList(); //or whatever you want to eager load