automapper将深层对象自动化为扁平对象和后退

时间:2013-09-06 19:56:47

标签: c# automapper

如何使用automapper将深层对象转换为平面对象并返回?

例如:

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

3 个答案:

答案 0 :(得分:5)

您可以通过两种方式实现这一目标:

  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 }));
    
  3. 我个人会选择选项1.这样,如果向FlatObject添加属性,则不必担心更新映射定义(如果使用选项#2,则可以这样做。)

    但是,@Raphaël指出作者的链接是正确的,该链接质疑映射到域对象的有效性。

答案 1 :(得分:1)

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

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

这会创建两个贴图,展平贴图用于创建反转贴图。

detailed info at the automapper documentation

答案 2 :(得分:0)

嗯,AutoMapper可以用于“自动”扁平化,只需尊重命名约定,在你的情况下

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

但是AFAIK,AutoMapper并没有做不爽。

请参阅图书馆作者的this

他们是其他工具(具有其他类型的限制),例如ValueInjecter