在我的数据层我有一个资料库,可以返回类似这样的项目清单:
new List<Item> {
new Item { Title = "Something", DetailId = 500 },
new Item { Title = "Whatever", DetailId = 501 },
}
该库已经给项目细节ID时,可以返回这些项目的详细信息,另一种方法:
// repository.GetDetail(500) would return something like:
new ItemDetail {
Id = 500,
Size = "Large"
}
现在,我的服务层,我想一个上面的列表映射到这样的事情:
new List<ServiceItem> {
new ServiceItem { Title = "Something", Size = "Large" },
new ServiceItem { Title = "Whatever", Size = "Medium" },
}
请注意,我既需要从列表(对象的属性Title
在这种情况下),并从具体的对象。 是否有与AutoMapper映射对此有何好办法?
我曾经想过做这取决于我的存储库实例的配置文件,然后有AutoMapper做详细的要求,但它那种感觉凌乱有AutoMapper获取新的数据?
有没有干净的方式从两个对象映射到一个?
一种可能性是包装您的项目,ItemDetail对象的元组和定义基于关闭该元组的地图。 映射代码会是这个样子。
Mapper.CreateMap<Tuple<Item, ItemDetail>, ServiceItem>()
.ForMember(d => d.Title, opt => opt.MapFrom(s => s.Item1.Title))
.ForMember(d => d.Size, opt => opt.MapFrom(s => s.Item2.Size));
你将不得不加入正确的项目和ItemDetail自己。 如果你想Automapper也符合项目的正确ItemDetail,你需要改变映射,这样大小的分辨率时,Automapper执行查找并返回本场比赛的大小。 该代码会是这个样子。
Mapper.CreateMap<Item, ServiceItem>()
.ForMember(d => d.Size, opt => opt.MapFrom(s => itemDetails.Where(x => s.DetailId == x.Id).First().Size));
此地图使用Automapper的自动映射功能Item.Title映射到ServiceItem.Title。 该地图是使用一个IEnumerable命名itemDetails找到了比赛,但它应该是可能的数据库调用来取代它。 现在,因为这样类型的查找的东西,我不认为Autmapper设计做,性能可能不适合大量物品的,伟大的。 这将是一些测试。
该博客介绍了一种方法来做到这一点: http://consultingblogs.emc.com/owainwragg/archive/2010/12/22/automapper-mapping-from-multiple-objects.aspx 。 它使每个输入对象的一个地图()调用,但至少把它包装起来的一个帮手。
使用ValueInjecter代替AutoMapper,它很容易在两者之间ValueInjecter支持注入来自多个源的值开箱切换,并且。
serviceItem.InjectFrom(item);
serviceItem.InjectFrom(itemDetail);
作为奖励,你不必像你这样做AutoMapper做的所有的静态映射