webentwicklung-frage-antwort-db.com.de

Einfaches Automapper-Beispiel

Es fällt mir schwer zu verstehen, wie man bestimmte Objekte abbildet. Bitte beantworten Sie einige Fragen zu diesem einfachen Beispiel.

Beispielcode

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

Die Mapper

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

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

Wenn Sie Group auf GroupDto abbilden, müssen Sie User intern auf UserDto abbilden, da die List<User> in Group bestehen aus nicht zugeordnetem Users? Wenn ja, wie machst du das? Meine Vermutung ist

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)))

Ist das richtig?

32
David

1- Ändern Sie die GroupD-Einstellung wie folgt:

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

2- Erstellen Sie Ihre Zuordnungen:

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- Das ist alles, weil der Auto-Mapper automatisch das List<User> bis List<UserDto> (da sie den gleichen Namen haben und es bereits eine Zuordnung von Benutzer zu UserDto gibt)

4- Wenn Sie eine Karte erstellen möchten, rufen Sie an:

Mapper.Map<GroupDto>(groupEntity);

Hoffentlich hilft das.

29
Omar.Alani

Wie @stuartd sagte, wenn Sie ändern:

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

zum :

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

du brauchst nur :

Mapper.CreateMap ()

Andernfalls ändern

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)))

für so etwas wie:

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)))

Dies wurde noch nicht getestet, aber die Idee ist da ....

5
Minus