使用AutoMapper将复杂对象展平为多个展平对象

时间:2017-01-28 08:44:27

标签: c# automapper

我有一个视图模型,例如

public class RootViewModel
{
    public CreateCompanyViewModel Company { get; set; }

    public string Name { get; set; }

    public string Email { get; set; }

    public string PhoneNumber { get; set; }

    public string Password { get; set; }

    public string ConfirmPassword { get; set; }

    public CreateUserTypeViewModel UserType { get; set; }
}

CreateCompanyViewModelCreateUserTypeViewModel就像

public class CreateCompanyViewModel
{
    public string CompanyName { get; set; }
}

public class CreateUserTypeViewModel
{
    public string UserTypeName { get; set; }
}

我希望将此RootVM展平为多个DTO。我所拥有的上述RootVM的3个DTO就像

public class UserDTO
{
    public string Name { get; set; }

    public string Email { get; set; }

    public string PhoneNumber { get; set; }

    public string Password { get; set; }

    public string ConfirmPassword { get; set; }
}

public class CompanyDTO
{
    public string CompanyName { get; set; }
}

public class UserTypeDTO
{
    public string UserTypeName { get; set; }
}

注意:请注意CompanyDTOUserTypeDTO不是RootVM的嵌套对象({1}}。

当我使用AutoMapper进行映射时RootVM属性被映射到UserDTO,但UserDTOCompanyDTO按预期为空。

我尝试使用UserTypeDTO函数使用ForMemberMapFrom方法映射它们,但它们都显示错误

  

成员的自定义配置仅支持顶级   个人成员。

更新 下面是我的映射代码

ResolveUsing

我正在使用 AutoMapper 5.2.0

更新 - 修复: 我发现的是,我必须手动使用.ForMember表示所有属性,否则自动约定工作,我需要使用https://github.com/AutoMapper/AutoMapper/wiki/Flatteninghttps://arnabroychowdhurypersonal.wordpress.com/2014/03/08/flattening-object-with-automapper/

这是让它发挥作用的唯一方法。

希望我可以CreateMap<RootViewModel, CompanyDTO>(); CreateMap<RootViewModel, UserDTO>(); CreateMap<RootViewModel, UserTypeDTO>(); CreateMap<CreateCompanyViewModel, CompanyDTO>(); CreateMap<CreateUserTypeViewModel, UserTypeDTO>(); ,并且它会映射.ForMember(d => d, s => s.MapFrom(x => x.Company))中的所有属性。这本来非常方便,但AutoMapper并不支持这一点。

1 个答案:

答案 0 :(得分:2)

尝试以下

        CreateMap<CreateCompanyViewModel, CompanyDTO>();
        CreateMap<CreateUserTypeViewModel, UserTypeDTO>();

        CreateMap<RootViewModel, CompanyDTO>()
            .ForMember(dest => dest.CompanyName, opt => opt.MapFrom(src => src.Company.CompanyName));

        CreateMap < RootViewModel, UserTypeDTO()
              .ForMember(dest => dest.UserTypeName, opt => opt.MapFrom(src => src.UserType.UserTypeName));

        CreateMap<RootViewModel, UserDTO>();