2015-10-15 4 views
7

कस्टम प्रकार कनवर्टर के अंदर कस्टम वैल्यू रिज़ॉल्यूशन का उपयोग कैसे कर सकता हूं? वर्तमान में, मुझे यह हासिल करना मुश्किल लगता है। क्या आप इस वर्ग का उपयोग कैसे कर सकते हैं इसका एक तरीका जानते हैं?ऑटोमैपर - कस्टम प्रकार कनवर्टर के अंदर कस्टम वैल्यू रिज़ॉल्वर का उपयोग कैसे करें


व्यक्ति कनवर्टर

class PersonConverter : ITypeConverter<PersonData, Person> 
{ 
    public Person Convert(ResolutionContext context) 
    { 
     var personData = context.SourceValue as PersonData; 
     if (personData == null) 
     { 
      return null; 
     } 

     var person = new Person 
     { 
      Name = personData.Name 
     }; 
     //person.Dic = // use here my DictionaryResolver 

     return person; 
    } 
} 

मॉडल

class Person 
{ 
    public string Name { get; set; } 
    public Dictionary Dic { get; set; } 
} 

class PersonData 
{ 
    public string Name { get; set; } 
    public int DicId { get; set; } 
} 

class Dictionary 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

मूल्य समाधानकर्ता

class DictionaryResolver : ValueResolver<int, Dictionary> 
{ 
    protected override Dictionary ResolveCore(int source) 
    { 
     // do something 
     return new Dictionary 
     { 
      Id = source, 
      Name = "Name" 
     }; 
    } 
} 

उत्तर

8

कस्टम मूल्य रिसोल्वर एक विशिष्ट सदस्य की मैपिंग अधिभावी, जब AutoMapper वस्तुओं मैप करने के लिए जा रहा है के लिए तैयार कर रहे हैं:

Mapper.CreateMap<PersonData, Person>() 
       .ForMember(dest => dest.Dic, opt => opt.ResolveUsing<DictionaryResolver>()); 

हालांकि, जब आप एक कस्टम प्रकार समाधानकर्ता का उपयोग करें, इस मानचित्रण का पूरा नियंत्रण लेता है : अनुरूपण कैसे एक विशेष सदस्य मैप किया गया है का कोई रास्ता नहीं है:

Mapper.CreateMap<TPersonData, Person>().ConvertUsing(PersonConverter); // No ForMember here. 

हालांकि, यह देखते हुए आप प्रकार रूपांतरण के दौरान पूरा नियंत्रण है कि, वहाँ मूल्य कनवर्टर, तो आप सिर्फ हा पुन: उपयोग आप को रोकने से कुछ भी नहीं है

class DictionaryResolver : ValueResolver<int, Dictionary> 
{ 
    public Dictionary Resolve(int source) 
    { 
     return ResolveCore(source); 
    } 

    protected override Dictionary ResolveCore(int source) 
    { 
     // do something 
     return new Dictionary 
     { 
      Id = source, 
      Name = "Name" 
     }; 
    } 
} 

फिर प्रकार के दौरान रूपांतरण आप इसे कहते है कि संपत्ति को हल करने: लेकिन यदि आप किसी सार्वजनिक विधि है जो संरक्षित विधि ResolveCore रिटर्न जोड़ना होगा: यह विशेष रूप से संदर्भित करने के लिए किया है

var person = new Person 
    { 
     Name = personData.Name 
    }; 

DictionaryResolver resolver = new DictionaryResolver(); 
person.Dic = resolver.Resolve(personData.IntValue); // whatever value you use 
+0

धन्यवाद, यह एक अच्छा जवाब है –

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