2011-12-02 16 views
13

क्या ऑटोमैपर का उपयोग करके निजी सेटर्स के साथ गुण असाइन करना संभव है?निजी सेटर्स के साथ ऑटोमैपर मैपिंग गुण

+0

Automapper किस संस्करण का उपयोग कर रहे हैं? क्या आपने इसे करने की कोशिश की है? – PatrickSteele

+8

@ब्लॉकहेड वास्तव में यह एक बहुत ही महत्वपूर्ण सवाल है, अपरिवर्तनीय वस्तुएं ऑब्जेक्ट्स की तुलना में एक बेहतर बेहतर वास्तुशिल्प अभ्यास हैं जिन्हें इच्छानुसार बदला जा सकता है (अपने सेटर्स को सार्वजनिक रूप से उजागर करके)। यह सटीक कारण है कि एंटीटी फ्रेमवर्क ने हाल ही में प्रारंभिक हाइड्रेशन के बाद डोमेन मॉडल को अपरिवर्तनीय रहने की अनुमति देने के लिए निजी गुणों में हाइड्रेट करने की क्षमता को जोड़ा है। शायद यह लीज़िला नहीं है जिसे अपने वास्तुकला पर ब्रश करने की जरूरत है। ;) – Marchy

+0

क्षमा करें? निजी संपत्तियों को निजी माना जाता है। यह डेटा है जो वस्तु से संबंधित है, और केवल वस्तु जानता है, और उस डेटा के बारे में जानना चाहिए। – blockhead

उत्तर

15

आप इस

public class RestrictedName 
{ 
    public RestrictedName(string name) 
    { 
     Name = name; 
    } 

    public string Name { get; private set; } 
} 

public class OpenName 
{ 
    public string Name { get; set; } 
} 

की तरह निर्माता में इस गुण के लिए मान सेट करते हैं तो आप इस

Mapper.CreateMap<OpenName, RestrictedName>() 
      .ConstructUsing(s => new RestrictedName(s.Name)); 

जो इस कोड

var openName = new OpenName {Name = "a"}; 
var restrictedName = Mapper.Map<OpenName, RestrictedName>(openName); 
Assert.AreEqual(openName.Name, restrictedName.Name); 
+2

यह नवीनतम संस्करण के साथ आवश्यक प्रतीत नहीं होता है। मैं निजी सेटर्स के साथ कक्षाओं में मैप करने में सक्षम हूं। यह आंतरिक रूप से प्रतिबिंब का उपयोग करना चाहिए। – Monstieur

+0

@Locutus शायद आप उस टिप्पणी को उत्तर में बदल सकते हैं? इसे शायद इस प्रश्न के नए उत्तर के रूप में चिह्नित किया जाना चाहिए। – julealgon

9

साथ काम करता है की तरह ConstructUsing उपयोग कर सकते हैं ऑटोमैपर अब निजी सेटर्स के साथ गुणों को मैप करने के लिए (मुझे यकीन नहीं है, जब से) सुनिश्चित करता है। यह वस्तुओं को बनाने के लिए प्रतिबिंब का उपयोग कर रहा है।

उदाहरण कक्षाएं:

public class Person 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 
} 


public class PersonDto 
{ 
    public string Fullname { get; private set; } 
} 

और मानचित्रण:

AutoMapper.Mapper.CreateMap<Person, PersonDto>() 
    .ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname)); 

var p = new Person() 
{ 
    Name = "John", 
    Surname = "Doe" 
}; 

var pDto = AutoMapper.Mapper.Map<PersonDto>(p); 

AutoMapper कोई समस्या नहीं के साथ निजी सेटर के साथ संपत्ति के नक्शे होगा। यदि आप encapsulation को मजबूर करना चाहते हैं, तो आपको IgnoreAllPropertiesWithAnInaccessibleSetter का उपयोग करने की आवश्यकता है। इस विकल्प के साथ, सभी निजी संपत्तियों (और अन्य पहुंच योग्य) को नजरअंदाज कर दिया जाएगा।

AutoMapper.Mapper.CreateMap<Person, PersonDto>() 
    .ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname)) 
    .IgnoreAllPropertiesWithAnInaccessibleSetter(); 

यदि आप सिल्वरलाइट का उपयोग करेंगे, तो समस्या उभर जाएगी। MSDN के अनुसार: https://msdn.microsoft.com/en-us/library/stfy7tfc(v=VS.95).aspx

In Silverlight, you cannot use reflection to access private types and members. 
3

#600 Private/internal destination properties देखें।

समाधान:

public class PrivateInternalProfile { 
    protected override Configure() { 
     ShouldMapField = fieldInfo => true; 
     ShouldMapProperty = propertyInfo => true; 
     CreateMap<User, UserDto>(); //etc 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^