具有嵌套对象和容器的 AutoMapper class

AutoMapper with nested objects and container class

我正在使用 .NET 核心开发 API 并使用 AutoMapper。

所有 API 响应都将在 JSON 响应中用数据元素包装,如下例

获取用户

{
  "data" {
       "id" : 1,
       "user_name": "abc"
       "countryr" : {
         "id" : 1348,
         "code" : "USA"
        } 
   }
}

所以我们有一个 UserCountry

的实体
  public partial class User
    {

        public int Id { get; set; }
        public string FirstName { get; set; }

        public virtual Country country { get; set; }

    }  

  public partial class Country
    {
        public int Id { get; set; }
        public string Code{ get; set; }
    }

为了将实体映射到 DTO,我们有下面的 reponseDTO

 public class GetUserDTO {
      public User data {get; set;} // To wrap reponse with data
    }

 public class UserDto {
    public int id {get; set;}
    public String user_name {get; set;}
    public Country country {get; set;}
    }

 public class CountryDto  {
    public int id {get; set;}
    public String code {get; set;}
   }

根据我的理解,我应该将实体 User 映射到 UserDTO 并将 Country 实体映射到 CountryDTO 但是 GetUserDTO class 本身呢?它基本上包含其他实体,因此 class 本身不能映射到它充当容器的任何东西。

下面我所做的是不正确的

public class UserProfile : AutoMapper.Profile
{
    public MappingProfile()
    {

        CreateMap<User, GetUserDTO>();
        CreateMap<User, UserDto>()
        .ForMember(userDto => userDto.user_name, map => map.MapFrom(user => user.FirstName))
        CreateMap<Country, CountryDto>();


    }
}

Json 回应

{
  "data" : null
}

遇到这种情况怎么办?

您不应在 DTO classes 中引用您的实体 classes。您可能想要如下更改 DTO。

public class GetUserDTO {
  public UserDto data {get; set;} // To wrap reponse with data
}
public class UserDto {
  public int id {get; set;}
  public string user_name {get; set;}
  public CountryDto country {get; set;}
} 
public class CountryDto  {
  public int id {get; set;}
  public string code {get; set;}

}

然后在 Mapper 配置文件中,您需要显式映射每个 属性,因为情况不同(如果名称完全相同,AutoMapper 将在不显式映射的情况下进行映射。在您的示例中,有一个案例差异)

然后从 MapperProfile 中删除以下行,因为没有从 User class 到 GetUserDTO class 的映射。这就是您没有得到任何输出的原因。

CreateMap<User, GetUserDTO>();

在获取数据时,您应该创建一个新的 GetUserDTO 实例 class 并根据用户对象的映射结果设置 属性“数据”。

这将为您提供输出。