自动映射器自动将深层对象映射到平面对象并返回

本文关键字:对象 映射 平面 返回 | 更新日期: 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; }
}

自动映射器自动将深层对象映射到平面对象并返回

有两种方法可以实现此目的:

  1. 定义两个映射,一个来自FlatObject --> Person,另一个来自FlatObject --> Address

    Mapper.CreateMap<FlatObject, Address>();
    Mapper.CreateMap<FlatObject, Person>()
        .ForMember(dest => dest.Address, opt => opt.MapFrom(src => src));
    
  2. 定义
  3. 一个映射并在映射定义中创建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