2013-12-17 13 views
17

Es fällt mir schwer zu verstehen, wie man bestimmte Objekte abbildet. Bitte beantworten Sie einige Fragen zu diesem einfachen Beispiel.Simple Automapper 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 Group-GroupDto abbildet, sind Sie User zu UserDto intern zur Karte haben, weil die List<User> in Group bestehen aus unmapped Users ? Wenn ja, wie machst du das? Meine Schätzung 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 korrekt?

+4

Warum enthält Ihr GroupDTO keine UserDTOs? Wenn dies der Fall wäre, wäre keine weitere Konfiguration als CreateMap erforderlich, damit AutoMapper funktioniert. – stuartd

+0

Hier ist ein einfacher Artikel, den ich auf Automapper mit C# geschrieben habe http://www.codeproject.com/Articles/986460/What-is-Automapper –

+0

Lesen Sie diesen Artikel: http://www.codearsenal.net/2012/12/ csharp-object-to-object-mapping-automapper.html –

Antwort

4

Wie @stuartd gesagt, 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; }  
} 

für:

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

Sie gerade brauchen:

Mapper.CreateMap()

Ansonsten, chan

ge
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 nicht getestet, aber die Idee ist hier ....

17

1- Ändern der GroupDto so sein:

[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 Auto-Mapper automatisch die List<User> zu List<UserDto> Karte wird (da sie denselben Namen haben, und es gibt bereits eine Zuordnung von Benutzer zu UserDto)

4- Wenn Sie die Sie zuordnen möchten Anruf:

Mapper.Map<GroupDto>(groupEntity); 

Hoffe, dass hilft.

+0

"da sie den gleichen Namen haben" - auch wichtig eingeben?Wenn ein Objekt eine Liste ist und ein anderes ICollection ist, erfordert es eine Mitgliederzuordnung? – batmaci

+0

Ich möchte ein aktualisiertes Beispiel für AutoMapper 5 sehen. Ich glaube nicht, dass das meiste davon mehr gültig ist. – jocull