2017-06-04 9 views
13
public class Foo 
{ 
    public string Baz { get; set; } 
    public List<Bar> Bars { get; set; } 
} 

, वहाँ परिभाषित करने के लिए कितना गहरा मैं वस्तुओं को मैप करने के automapper चाहते किसी भी तरह से है?AutoMapper मानचित्रण स्तर जब मैं श्रेणी से ऊपर के नक्शे को परिभाषित

var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 0 }); 
// result = { Baz: "" } 

var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 1 }); 
// result = { Baz: "", Bars: [{ Blah: "" }] } 

var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 2 }); 
// result = { Baz: "", Bars: [{ Blah: "", Buzz: [{ Baz: "" }] }] } 

// etc... 

मैं वर्तमान में एक nuget निर्भरता की वजह से 3.3 automapper उपयोग कर रहा हूँ: मैं के बाद क्या कर रहा हूँ के कुछ छद्म कोड।

+0

नवीनतम संस्करण में भी automapper में स्तर सेट करने का कोई तरीका नहीं है। क्योंकि आप एक समय में केवल 1 स्तर के पदानुक्रम से निपटते हैं। आपके मामले में आपको 2 मैपर कॉन्फ़िगरेशन की आवश्यकता है। 'फू' के लिए एक और 'बार' के लिए दूसरा। आप किसी भी प्रॉपर्टी के लिए अपने मैपर कॉन्फ़िगरेशन में 'opt.Ignore() 'का उपयोग कर सकते हैं, जिसे आप मानचित्र बनाना नहीं चाहते हैं। Automapper स्वचालित रूप से मानचित्र करता है यदि ऑब्जेक्ट्स के नाम समान हैं या मेल खाते हैं। मुझे लगता है कि आपके मामले में ऑब्जेक्ट नाम अलग हैं और आपको प्रत्येक ऑब्जेक्ट के लिए कॉन्फ़िगरेशन की आवश्यकता है। – Venky

उत्तर

7

आप इसे रनटाइम पर एक मूल्य प्रदान करके कर सकते हैं जैसा कि उत्तर में दिया गया था: How to ignore a property based on a runtime condition?

विन्यास:

Mapper.CreateMap<Foo, FooDTO>().ForMember(e => e.Bars, 
    o => o.Condition(c => !c.Options.Items.ContainsKey("IgnoreBars"))); 

उपयोग:

Mapper.Map<FooDTO>(foo, opts => { opts.Items["IgnoreBars"] = true; }); 

एक ही विन्यास दृष्टिकोण आप अपने सभी नेस्टेड वस्तुओं है कि आप स्तरों फोन के लिए आवेदन कर सकते हैं।

यदि आप अपनी डीबी इकाइयों के लिए समान व्यवहार प्राप्त करना चाहते हैं तो आप इस उत्तर में वर्णित ExplicitExpansion दृष्टिकोण का उपयोग कर सकते हैं: Is it possible to tell automapper to ignore mapping at runtime?

विन्यास:

Mapper.CreateMap<Foo, FooDTO>() 
    .ForMember(e => e.Bars, o => o.ExplicitExpansion()); 

उपयोग:

dbContext.Foos.Project().To<FooDTO>(membersToExpand: d => d.Bars); 
संबंधित मुद्दे