从两个项目与automapper映射(Mapping from two items with aut

2019-09-21 09:52发布

在我的数据层我有一个资料库,可以返回类似这样的项目清单:

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获取新的数据?

有没有干净的方式从两个对象映射到一个?

Answer 1:

一种可能性是包装您的项目,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设计做,性能可能不适合大量物品的,伟大的。 这将是一些测试。



Answer 2:

该博客介绍了一种方法来做到这一点: http://consultingblogs.emc.com/owainwragg/archive/2010/12/22/automapper-mapping-from-multiple-objects.aspx 。 它使每个输入对象的一个​​地图()调用,但至少把它包装起来的一个帮手。



Answer 3:

使用ValueInjecter代替AutoMapper,它很容易在两者之间ValueInjecter支持注入来自多个源的值开箱切换,并且。

serviceItem.InjectFrom(item);
serviceItem.InjectFrom(itemDetail);

作为奖励,你不必像你这样做AutoMapper做的所有的静态映射



文章来源: Mapping from two items with automapper
标签: c# AutoMapper