使用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那样进行所有静态映射
- Automapper创建新实例而不是地图属性
- 用简单的注射器替换Ninject
- AutoMapper AssertConfigurationIsValid是否足以确保良好的映射?
- ASP.net MVC – 我应该使用ViewModel中的AutoMapper到Entity Framework实体吗?
- 使用AutoMapper获取exception
- 是否可以将IQueryable 映射到IQueryable ?
- 如何使用AutoMapper深度克隆包含IList属性的对象
- AutoMapper:PreserveReferences和MaxDepth有什么区别?
- 用于双向映射的简单约定自动映射(来自/来自ViewModels的实体)