2011-11-08 13 views
16

के साथ रीडोनली बाल संग्रह मैपिंग यह इतना सवाल नहीं है, क्योंकि मुझे ऐसा करने का कोई तरीका मिल गया है, लेकिन ऐसा लगता है कि ऐसा करने का एक बेहतर तरीका होना चाहिए। मैंने हर जगह खोज की है और कुछ भी नहीं मिला है।ऑटोमैपर

असल में, मेरे पास एक मानक मानक मॉडल है जो मैं मानता हूं।

public class Parent 
{ 
    private readonly IList<Child> _children = new List<Child>(); 
    public IEnumerable<Child> Children { get { return _children; } } 
    public void AddChild(Child child) 
    { 
     child.Parent = this; 
     _children.Add(child); 
    } 
} 

और

public class Child 
{ 
    public Parent Parent { get; set; } 
} 

(मैं गुण समस्या और त्रुटि जाँच के लिए अप्रासंगिक और स्पष्टता के लिए रखवाली हटा दिया है ...)

public class ParentDTO 
{ 
    List<ChildDTO> Children = new List<ChildDTO>(); 
} 

और

public class ChildDTO 
{ 
} 

कारण मैं संग्रह में बच्चों को जोड़ने के लिए एक विधि का उपयोग कर रहा हूं वह व्यवसाय तर्क पर नियंत्रण बनाए रखना है जिसे बच्चे को जोड़ा जाने पर संसाधित करने की आवश्यकता होती है।

के मानक मानचित्रण के साथ

:

Mapper.CreateMap<Parent, ParentDTO>(); 
Mapper.CreateMap<ParentDTO, Parent>(); 
Mapper.CreateMap<Child, ChildDTO>(); 
Mapper.CreateMap<ChildDTO, Child>(); 

यह ठीक सेवा परत से आ रही काम करने के लिए लगता है। ChildDTO उदाहरणों की सूची में डोमेन ऑब्जेक्ट मानचित्र पूरी तरह से मानचित्र।

हालांकि, दूसरी तरफ मैपिंग करते समय, डोमेन मॉडल पर संग्रह सेट नहीं है - क्योंकि यह स्पष्ट रूप से, स्पष्ट रूप से है। AutoMapper का उपयोग करके निजी फ़ील्ड को सीधे सेट करने का कोई तरीका नहीं दिखता है। मैंने यहां और इंटरनेट के अन्य हिस्सों पर पाए गए विभिन्न सुझावों का प्रयास किया है।

अंत में, मैं निम्नलिखित मानचित्रण के साथ आया था:

Mapper.CreateMap<ParentDTO, Parent>() 
    .ForMember(m => m.Children, o => o.Ignore()) 
    .AfterMap((s, d) => 
         { 
          foreach(var c in s.Children) 
           d.AddChild(Mapper.Map<ChildDTO, Child>(c)); 
         }); 

यह काम करता है के रूप में मैं की आवश्यकता है। हालांकि, मैं यह महसूस करने में मदद नहीं कर सकता कि एक बेहतर तरीका होना चाहिए, और मैंने इसका परीक्षण किसी मौजूदा माता-पिता के साथ नहीं किया है जिसने बच्चों को संशोधित किया है और शायद जोड़ा और निकाल दिया गया है, इसलिए मुझे पता है कि यह वास्तव में अभी तक सही नहीं है। आखिरकार, यह डोमेन मॉडल NHibernate का उपयोग करके जारी रखा गया है, इसलिए मुझे इसके बारे में चिंता करने की ज़रूरत है। लेकिन, एक समय में एक बात। :)

उम्मीद है कि यह किसी और की मदद कर सकता है जो एक ही समस्या का सामना कर रहा है, और शायद कोई भी जिसने इसे ठीक से हल किया है, वह मुझे सही करने में सक्षम होगा।

+2

+1 आपके बाद के समाधान ने मुझे बचाया। –

+0

कूल समाधान। मैं इसे उधार लेगा :-) – LeftyX

+0

AfterMap के साथ बढ़िया विचार। समाधान और गंतव्य वस्तुओं के साथ समाधान करने के लिए समाधान और गंतव्य वस्तुओं के साथ काम करना इतना आसान है! – Andrei

उत्तर

0

मुझे लगता है कि यदि आप अच्छे व्यापार तर्क कारणों के लिए गुणों की रक्षा करने जा रहे हैं तो यह खराब होगा अगर ऑटोमैपर ने मैपिंग करते समय उन्हें घुमाया।

private Parent MapParentDTOToParent(ParentDTO source) 
{ 
    var parent = new Parent(); 
    // Business logic here 
    return parent 
} 

और उसके बाद: इन परिस्थितियों में मैं धाराप्रवाह वाक्य रचना का परित्याग और इस तरह अपनी ही विधि में निर्माण तर्क जगह पसंद करते हैं

Mapper.CreateMap<ParentDTO, Parent>().ConvertUsing(MapParentDTOToParent); 

मैं इस आसान के बहुत सारे होने से पालन करने के लिए लगता है घोषणाओं को अनदेखा करें।

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