2013-12-17 2 views
17

Мне сложно понять, как сопоставить определенные объекты. Ответьте на некоторые вопросы об этом простом примере.Пример Simple Automapper

Пример кода

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

В картостроители

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

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

При отображении Group в GroupDto, вы должны карту User к UserDto внутренне, потому что List<User> в Group состоят некартированных Users ? Если да, то как вы это делаете? Моя догадка

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

Это правильно?

+4

Почему ваш GroupDTO не содержит UserDTO? Если бы это было сделано, для работы AutoMapper больше не понадобилось бы никакой конфигурации, кроме «CreateMap». – stuartd

+0

Вот простая статья, которую я написал на Automapper, используя C# http://www.codeproject.com/Articles/986460/What-is-Automapper –

+0

Прочтите эту статью: http://www.codearsenal.net/2012/12/ csharp-object-to-object-mapping-automapper.html –

ответ

4

Как сказал @stuartd, если вы меняете:

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

для:

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

вам просто нужно:

Mapper.CreateMap()

В противном случае, 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))) 

что-то вроде:

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

Это не испытывалась, но идея здесь ....

17

1- Изменение GroupDto быть похожим на это:

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

2- Создайте отображения:

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- это все, потому что автоматический преобразователь автоматически на карте List<User> к List<UserDto> (поскольку они имеют такое же имя, и есть уже отображение от пользователя к UserDto)

4- Если вы хотите отобразить вас телефон:

Mapper.Map<GroupDto>(groupEntity); 

Надеюсь, что это поможет.

+0

«так как у них одно и то же имя», - также важно ли значение?Если один объект является списком, а другой - ICollection, требуется ли ему сопоставление элементов? – batmaci

+0

Я хотел бы увидеть обновленный пример для AutoMapper 5. Я не думаю, что большая часть этого действительна. – jocull

Смежные вопросы