web-dev-qa-db-fra.com

Exemple Simple Automapper

J'ai du mal à comprendre comment cartographier certains objets. Veuillez répondre à quelques questions sur cet exemple simple.

Exemple de code

class User
{
    private int id;
    private string name;
}

class Group
{
    private int id;
    private string name;
    private List<User> users;
}

[DataContract]
public class UserDto
{
    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string name{ get; set; }      
}

[DataContract]
public class GroupDto
{
    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string name{ get; set; }
    [DataMember]
    public List<User> Users { get; set; }      
}

Les mappeurs

Mapper.CreateMap<User, UserDto>();
Mapper.CreateMap<UserDto, User>();

Mapper.CreateMap<Group, GroupDto>();
Mapper.CreateMap<GroupDto, Group>();

Lorsque vous mappez Group à GroupDto, devez-vous mapper User à UserDto en interne car le List<User> dans Group est constitué de Users non mappé? Si oui, comment faites-vous cela? Ma conjecture est

Mapper.CreateMap<Group, GroupDto>()
    .ForMember(g => g.id, opt => opt.Ignore());
    .ForMember(g => g.name, opt => opt.Ignore());
    .ForMember(g => g.Users, opt => opt.MapFrom(u => Mapper.Map<Group, UserDto>(u)))

Est-ce correct?

32
David

1- Changer le GroupD pour être comme ceci:

[DataContract]
public class GroupDto
{
    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string name{ get; set; }
    [DataMember]
    public List<UserDTO> Users { get; set; }      
}

2- Créez vos mappages:

Mapper.CreateMap<User, UserDto>();
Mapper.CreateMap<UserDto, User>(); // Only if you convert back from dto to entity

Mapper.CreateMap<Group, GroupDto>();
Mapper.CreateMap<GroupDto, Group>(); // Only if you convert back from dto to entity

3- c'est tout, car mappeur automatique mappera automatiquement le List<User> à List<UserDto> (car ils portent le même nom et qu’il existe déjà un mappage entre utilisateur et UserDto)

4- Lorsque vous souhaitez mapper, vous appelez:

Mapper.Map<GroupDto>(groupEntity);

J'espère que ça t'as aidé.

29
Omar.Alani

Comme @stuartd l'a dit, si vous changez:

[DataContract]
public class GroupDto
{
    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string name{ get; set; }
    [DataMember]
    public List<User> Users { get; set; }      
}

pour :

[DataContract]
public class GroupDto
{
    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string name{ get; set; }
    [DataMember]
    public List<UserDTO> Users { get; set; }      
}

vous avez juste besoin :

Mapper.CreateMap ()

Sinon, changez

Mapper.CreateMap<Group, GroupDto>()
    .ForMember(g => g.id, opt => opt.Ignore());
    .ForMember(g => g.name, opt => opt.Ignore());
    .ForMember(g => g.Users, opt => opt.MapFrom(u => Mapper.Map<Group, UserDto>(u)))

pour quelque chose comme:

Mapper.CreateMap<Group, GroupDto>()
    .ForMember(g => g.id, opt => opt.Ignore());
    .ForMember(g => g.name, opt => opt.Ignore());
    .ForMember(g => g.Users, opt => opt.MapFrom(u => Mapper.Map<List<User>>(g.Users)))

Cela n'a pas été testé, mais l'idée est ici ....

5
Minus