自动映射器自动将深层对象映射到平面对象并返回
本文关键字:对象 映射 平面 返回 | 更新日期: 2023-09-27 18:30:25
如何使用
自动映射器将深度对象转换为平面对象并返回?
例如:
Person
{
public string Name { get; set; }
public Address Address { get; set; }
}
Address
{
public string City { get; set; }
public string State { get; set; }
}
FlatObject
{
public string Name { get; set; }
public string City { get; set; }
public string State { get; set; }
}
有两种方法可以实现此目的:
-
定义两个映射,一个来自
FlatObject --> Person
,另一个来自FlatObject --> Address
:Mapper.CreateMap<FlatObject, Address>(); Mapper.CreateMap<FlatObject, Person>() .ForMember(dest => dest.Address, opt => opt.MapFrom(src => src));
定义 一个映射并在映射定义中创建
Address
对象:Mapper.CreateMap<FlatObject, Person>() .ForMember( dest => dest.Address, opt => opt.MapFrom( src => new Address { City = src.City, State = src.State }));
就个人而言,我会选择选项 1。这样,如果您将属性添加到 FlatObject
,则不必担心更新映射定义(如果您使用选项 #2,则无需担心)。
但是,@Raphaël指出作者的链接是正确的,该链接质疑映射到域对象的有效性。
从版本 6.0.1 开始,您可以使用 ReverseMap 方法,该方法用于创建未拼合的地图。
Mapper
.CreateMap<FlatObject, Person>()
.ReverseMap();
这将创建两个地图,平展地图用于创建反向地图。
在自动映射器文档中有详细信息
好吧,AutoMapper 可以"自动"展平化,只需尊重命名约定,在您的情况下
FlatObject {
public string Name {get;set;}
public string AddressCity {get;set;}
public string AddressState {get;set;}
}
但是AFAIK,AutoMapper不做不扁平化。
从图书馆的作者那里看到这个。
它们是这样做的其他工具(具有其他类型的限制),例如ValueInjecter