2013-12-17 22 views
17

Belirli nesneleri nasıl eşleyeceğimi anlamak için zor bir zaman geçiriyorum. Lütfen bu basit örnekle ilgili bazı soruları yanıtlayın.Simple Automapper Örnek

Örnek kod

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

haritacılar

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

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

GroupDto için Group haritalama, içten Group içinde List<User>Users bağlanılmayan oluşur çünkü UserDto için User haritaya var ? Eğer öyleyse bunu nasıl yapıyorsun? Benim tahminim doğru değil mi?

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

için:

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

sadece gerekir:

Mapper.CreateMap()

+4

Neden GroupDTO'nuz UserDTO'ları içermiyor? Varsa, AutoMapper'ın çalışması için 'CreateMap''den başka bir yapılandırma gerekmeyecektir. – stuartd

+0

Burada C# http://www.codeproject.com/Articles/986460/What-is-Automapper –

+0

kullanarak Automapper üzerine yazdığım basit bir yazıyı okuyun. Bu makaleyi okuyun: http://www.codearsenal.net/2012/12/ csharp-object-to-object-mapping-automapper.html –

cevap

4

@stuartd değiştirmek eğer söylediği gibi Aksi halde, 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))) 
gibi bir şey için

: Bu test edilmemiştir

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

, ama fikir burada ....

17

1- Değişim GroupDto böyle olmak:

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

2- senin eşleşmeleri oluşturma:

(Bunlar aynı ada sahip olduğundan, ve UserDto için kullanıcıdan bir eşleme zaten vardır) oto mapper otomatik List<User> List<UserDto> için eşler size eşleştirmek istediğinizde

4- çünkü hepsi 0

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- arama:

Mapper.Map<GroupDto>(groupEntity); 

Yardım eder.

+0

"aynı ada sahip oldukları için" - aynı zamanda önemli mi?Bir nesne liste ise ve diğeri ICollection ise, üye eşlemesi gerektiriyor mu? – batmaci

+0

OtomatikMapper 5 için güncelleştirilmiş bir örnek görmek istiyorum. Bunun çoğunun geçerli olduğunu düşünmüyorum. – jocull