我想知道将我检索到的域对象列表转换为控制器中的自定义ViewModel的最佳方法
e.g。
IList<Balls> _balls = _ballsService.GetBalls(searchCriteria);
进入
IList<BallViewModels> _balls = _ballsService.GetBalls(searchCriteria);
它不一定与我上面概述的完全相同,即它不必是IList,如果不是直接访问服务,而是通过一些其他层将对象转换为viewmodels,那么好的。
感谢
答案 0 :(得分:7)
对于简单对象,您可以使用Linq:
IList<BallViewModel> _balls = _ballsService.GetBalls(searchCriteria)
.Select(b => new BallsViewModel
{
ID = b.ID,
Name = b.Name,
// etc
})
.ToList();
虽然这可能会非常重复,所以你可能想给你的BallViewModel类一个接受Ball的构造函数,并为你工作。
另一种方法是使用像AutoMapper这样的库将属性(甚至是嵌套的属性)从域对象复制到视图模型。
答案 1 :(得分:1)
可能有点像Linq,有点像
var ballQuery = from ball in _ballsService.GetBalls(searchCriteria)
select new BallViewModels
{
Diameter = ball.Diameter,
color = ball.Color,
...
}
IList<BallViewModels> _balls = ballQuery.ToList();
无论是那个问题还是问题都比我想象的要复杂......
答案 2 :(得分:1)
我一直使用AutoMapper来做这件事。它非常灵活,到目前为止对我没有任何麻烦。
首先,在应用初始化过程中设置地图:
Mapper.CreateMapping<Balls, BallViewModel>();
无论何时需要映射对象,都可以这样做:
Mapper.Map<IList<Balls>, IList<BallViewModel>>(_ballsService.GetBalls());
就像我说的那样,它非常灵活,您可以使用流畅的API修改每个属性的映射方式。