使用automapper从两个项目映射

在我的数据层中,我有一个存储库,可以返回这样的项目列表:

new List { 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 { new ServiceItem { Title = "Something", Size = "Large" }, new ServiceItem { Title = "Whatever", Size = "Medium" }, } 

请注意,我需要来自列表中的对象(本例中为Title )和详细对象的属性。 有没有什么好方法可以使用AutoMapper进行映射?

我已经考虑过创建一个依赖于我的存储库实例的配置文件,然后让AutoMapper执行详细请求,但让AutoMapper获取新数据有点麻烦吗?

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

一种可能性是将Item和ItemDetail对象包装在元组中,并根据该元组定义Map。 映射代码看起来像这样。

 Mapper.CreateMap, ServiceItem>() .ForMember(d => d.Title, opt => opt.MapFrom(s => s.Item1.Title)) .ForMember(d => d.Size, opt => opt.MapFrom(s => s.Item2.Size)); 

您必须自己加入正确的Item和ItemDetail。 如果您希望Automapper也将Item与正确的ItemDetail匹配,则需要更改映射,以便在解析Size时,Automapper执行查找并返回匹配的大小。 代码看起来像这样。

 Mapper.CreateMap() .ForMember(d => d.Size, opt => opt.MapFrom(s => itemDetails.Where(x => s.DetailId == x.Id).First().Size)); 

此映射使用Automapper的自动化function将Item.Title映射到ServiceItem.Title。 该映射使用IEnumerable命名的itemDetails来查找匹配,但应该可以用数据库调用替换它。 现在,由于我认为这种类型的查找不是Autmapper的设计目标,因此对于大量项目来说,性能可能不是那么好。 这将是一个需要测试的东西。

本博客描述了一种方法: http : //consultingblogs.emc.com/owainwragg/archive/2010/12/22/automapper-mapping-from-multiple-objects.aspx 。 它为每个输入对象进行一次Map()调用,但至少将其包装在一个帮助器中。

使用ValueInjecter而不是AutoMapper,它很容易在两者之间切换,而ValueInjecter支持从多个源开箱即可注入值。

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

作为奖励,您不必像使用AutoMapper那样进行所有静态映射