2011-10-24 16 views
8

मैंने नेस्टेड मैपिंग विकी पेज पढ़ा है लेकिन ऐसा लगता है कि यह घोंसले के कई स्तरों की तरह नहीं है। मुझे निम्नलिखित नक्शे बनाए गए हैं और कक्षाएं परिभाषित हैं।ऑटोमैपर नेस्टेड मैपिंग

AutoMapper.Mapper.CreateMap<Address, AddressDTO>(); 
AutoMapper.Mapper.CreateMap<MatchCompanyRequest, MatchCompanyRequestDTO>(); 

public class MatchCompanyRequest 
{ 
    Address Address {get;set;} 
} 

public class MatchCompanyRequestDTO 
{ 
    public CompanyInformationDTO {get;set;} 
} 

public class CompanyInformationDTO {get;set;} 
{ 
    public string CompanyName {get;set;} 
    public AddressDTO Address {get;set;} 
} 

लेकिन निम्नलिखित कोड ...

// works 
matchCompanyRequestDTO.companyInformationDTO.Address = 
    AutoMapper.Mapper.Map<Address, AddressDTO>(matchCompanyRequest.Address); 

// fails 
matchCompanyRequestDTO = 
    AutoMapper.Mapper 
     .Map<MatchCompanyRequest, MatchCompanyRequestDTO>(matchCompanyRequest); 

इस गहरे नेस्टिंग काम करता है और मैं इसे अनुचित रूप से कॉन्फ़िगर है? या इस तरह का घोंसला अभी तक समर्थित नहीं है?

- संपादित करें

रुचि किसी के लिए, मैं DTOs के नियंत्रण में नहीं हूँ।

उत्तर

6

इसमें पते से मैपिंग की कमी CompanyInformationDTO है, क्योंकि ये वस्तुएं एक ही घोंसला-स्तर पर हैं।

नक्शा MatchCompanyRequest लिए बनाया जाता है ->MatchCompanyRequestDTO, लेकिन यह यह CompanyInformationDTO को Address मैप कर सकते हैं कि क्या लगाने में असमर्थ है।

तो अपने MatchCompanyRequestDTO सकता है, वास्तव में आपका CompanyInformationDTO के रूप में ही घोषणा की है: आप स्वत: मानचित्रण उपयोग करना चाहते हैं

public class MatchCompanyRequestDTO 
{ 
    public string CompanyName {get;set;} 
    public AddressDTO Address {get;set;} 
} 

बेशक यह केवल आप को प्रभावित करता है। आप अभी भी अपने नक्शे मैन्युअल रूप से कॉन्फ़िगर कर सकते हैं, लेकिन ऐसा लगता है DTOs तरह के बजाय समाधान हो गया होगा, के लिए वैसे भी कोशिश करते हैं:

public class MatchCompanyRequest 
{ 
    Address Address {get;set;} 
} 

public class MatchCompanyRequestDTO 
{ 
    public string Name {get;set;} 
    public AddressDTO Address {get;set;} 
} 

public class AddressDTO 
{ 
    .... 
} 

आपका डीटीओ वस्तुओं एक ही है की जरूरत: बजाय निम्नलिखित पर विचार करें

public class CustomResolver : ValueResolver<Address, CompanyInformationDTO> 
{ 
    protected override CompanyInformationDTO ResolveCore(Address source) 
    { 
     return new CompanyInformationDTO() { Address = Mapper.Map<Address, AddressDTO>(source) }; 
    } 
} 
// ... 

AutoMapper.Mapper.CreateMap<MatchCompanyRequest, MatchCompanyRequestDTO>() 
    .ForMember(dest => dest.companyInformationDTO, opt => opt.ResolveUsing<CustomResolver>().FromMember(src => src.Address)); // here we are telling to use our custom resolver that converts Address into CompanyInformationDTO 
+0

कैसे यदि आप स्थिर उपयोग नहीं कर रहे कुछ इस तरह कॉन्फ़िगर कर दिया जाएगा 'मैपर' उदाहरण? – dougajmcdonald

+0

फिर आप 'AutoMapper.Mapper' के बजाय बस अपना उदाहरण उपयोग करें? मुझे वास्तव में पता नहीं है - मैंने कई वर्षों से ऑटोमैपर का उपयोग किया है ... – Bartosz

+0

हाँ आज का सबसे अच्छा अभ्यास एक प्रोफ़ाइल बनाना है और इसे कॉन्फ़िगरेशन में फ़ीड करना है ताकि आप इसे डीआई कर सकें और स्थिर उदाहरणों का उपयोग न करें। मैं उत्सुक हूं क्योंकि मैं इसे एक सामान्य समाधान के रूप में देखता हूं और आश्चर्य करता हूं कि यह वर्तमान सर्वोत्तम अभ्यास के साथ कैसे फिट बैठता है। – dougajmcdonald

0

ऑटोमैपर में काम करने के लिए डिफ़ॉल्ट मैपिंग सम्मेलनों के लिए आपके डोमेन ऑब्जेक्ट्स के रूप में संरचना।

इसे देखें: https://github.com/AutoMapper/AutoMapper/wiki/Projection यह आपके लिए प्रक्षेपण की व्याख्या करेगा, आप इसे अपने तरीके से काम करने के लिए अनुकूलित कर सकते हैं।

4

महत्वपूर्ण बात यह है कि आप अपनी नेविगेशन को कितना गहराई से परिभाषित करते हैं, स्टैक ओवरफ्लो समस्याओं को समाप्त करने के लिए। इस संभावना की कल्पना कीजिए:

आप 2 संस्थाओं उपयोगकर्ता और NxN मॉडल में सूचनाएं है (और आप DTOs कि प्रतिनिधित्व करते हैं पर आपत्ति है), जब आप उपयोगकर्ता ऑटो नक्शाकार बिना सेट MaxDepth आप में मैपर अभिव्यक्ति, "हस्टन हमारे पास समस्या है" :)।

कोड बेलो सभी मैपर के लिए इसे हल करने के लिए एक वर्कअराउंड दिखाता है। यदि आप चाहते हैं कि प्रत्येक मैपर को परिभाषित किया जा सके।Like this Question

समाधान 1 (ग्लोबल परिभाषा)

public class AutoMapperConfig 
{ 
    public static void RegisterMappings() 
    { 
     Mapper.Initialize(mapperConfiguration => 
     { 
      mapperConfiguration.AddProfile<DomainModelToYourDTOsMappingProfile>(); 
      mapperConfiguration.AddProfile<YourDTOsToDomainModelMappingProfile>(); 
      mapperConfiguration.AllowNullCollections = true; 
      mapperConfiguration.ForAllMaps 
      (
       (mapType, mapperExpression) => 
       { 
        mapperExpression.MaxDepth(1); 
       }); 
      }); 
     } 
    } 

समाधान 2 (प्रत्येक मैपर के लिए)

public class AutoMapperConfig 
{ 
    public static void RegisterMappings() 
    { 
     Mapper.CreateMap<User, DTOsModel>() 
       .MaxDepth(1); 
    } 
} 
+1

यह ओपी का सही जवाब नहीं है, लेकिन यह वास्तव में अच्छी जानकारी है। धन्यवाद! – Mathter

+0

धन्यवाद @ मैथटर! –

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