2

如何使用自动映射器将深层对象转换为平面对象并返回?

例如:

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; }
}
4

3 回答 3

6

有两种方法可以做到这一点:

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

    Mapper.CreateMap<FlatObject, Address>();
    
    Mapper.CreateMap<FlatObject, Person>()
        .ForMember(dest => dest.Address, opt => opt.MapFrom(src => src));
    
  2. 定义一个映射并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正确指出作者的链接质疑映射到域对象的有效性。

于 2013-09-06T20:12:44.270 回答
2

从 6.0.1 版本开始,您可以使用 ReverseMap 方法,该方法用于创建未展平的地图。

Mapper
  .CreateMap<FlatObject, Person>()
  .ReverseMap();

这将创建两个贴图,展平贴图用于创建反向贴图。

自动映射器文档中有详细信息

于 2018-03-09T13:22:47.617 回答
0

好吧,AutoMapper 可以用于“自动”展平,就您而言,只需尊重命名约定

FlatObject {
  public string Name {get;set;}
  public string AddressCity {get;set;}
  public string AddressState {get;set;}
}

但是 AFAIK,AutoMapper 不做 unflattening 。

从图书馆的作者那里看到这个。

它们是执行此操作的其他工具(具有其他类型的限制),例如ValueInjecter

于 2013-09-06T20:02:18.567 回答