2013-12-17 19 views
17

Tôi đang gặp khó khăn để hiểu cách ánh xạ một số đối tượng nhất định. Vui lòng trả lời một số câu hỏi về ví dụ đơn giản này.Ví dụ về Automapper Đơn giản

Ví dụ mã

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

Các mappers

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

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

Khi lập bản đồ Group-GroupDto, bạn có để lập bản đồ User để UserDto nội bộ vì List<User> trong Group bao gồm unmapped Users ? Nếu vậy, làm thế nào để bạn làm điều này? Đoán của tôi là

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

Điều này có đúng không?

+4

Tại sao GroupDTO của bạn không chứa UserDTO? Nếu có, không cần cấu hình nào khác ngoài 'CreateMap' để AutoMapper hoạt động. – stuartd

+0

Đây là bài viết đơn giản tôi đã viết trên Automapper sử dụng C# http://www.codeproject.com/Articles/986460/What-is-Automapper –

+0

Đọc bài viết này: http://www.codearsenal.net/2012/12/ csharp-object-to-object-mapping-automapper.html –

Trả lời

4

Như @stuartd nói, nếu bạn thay đổi:

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

cho:

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

bạn chỉ cần:

Mapper.CreateMap()

Nếu không, 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))) 

cho một cái gì đó như:

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

này chưa được thử nghiệm, nhưng ý tưởng là ở đây ....

17

1- Thay đổi GroupDto là như thế này:

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

2- Tạo bản đồ của bạn:

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 đó là tất cả, bởi vì tự động ánh xạ sẽ tự động lập bản đồ List<User> để List<UserDto> (kể từ khi họ có cùng tên, và đã có một ánh xạ từ người sử dụng để UserDto)

4 Khi bạn muốn ánh xạ bạn gọi:

Mapper.Map<GroupDto>(groupEntity); 

Hy vọng điều đó sẽ hữu ích.

+0

"vì chúng có cùng tên," - cũng có quan trọng không?Nếu một đối tượng là danh sách và một đối tượng khác là ICollection, nó có yêu cầu ánh xạ thành viên không? – batmaci

+0

Tôi muốn xem một ví dụ cập nhật cho AutoMapper 5. Tôi không nghĩ rằng hầu hết điều này là hợp lệ nữa. – jocull