2013-12-17 9 views
17

मुझे कुछ वस्तुओं को मैप करने के तरीके को समझने में कठिन समय है। कृपया इस सरल उदाहरण के बारे में कुछ प्रश्नों का उत्तर दें।सरल ऑटोमैपर उदाहरण

उदाहरण कोड

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

जब GroupDto को Group मानचित्रण, आंतरिक रूप से, क्योंकि Group में List<User> तुच्छ Users से मिलकर बनता है आप UserDto को User मैप करने के लिए है ? यदि ऐसा है तो आप यह कैसे करते हैं? मेरा अनुमान है

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

आपके ग्रुप डीटीओ में उपयोगकर्ता डीटीओ क्यों नहीं है? यदि ऐसा होता है, तो ऑटोमैपर के काम के लिए 'CreateMap' के अलावा अन्य कॉन्फ़िगरेशन की आवश्यकता नहीं होगी। – stuartd

+0

यहां सरल लेख है जिसे मैंने ऑटोमैपर पर सी # 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()

अन्यथा, चान जीई

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

"चूंकि उनके पास एक ही नाम है," - क्या महत्वपूर्ण भी है?यदि एक वस्तु सूची है और दूसरा आईसीओलेक्शन है, तो क्या इसे सदस्य मैपिंग की आवश्यकता होती है? – batmaci

+0

मैं ऑटोमैपर 5 के लिए एक अद्यतन उदाहरण देखना चाहता हूं। मुझे नहीं लगता कि इनमें से अधिकतर अब मान्य है। – jocull

संबंधित मुद्दे