जब गुणों के नाम अलग-अलग हों तो मैपिंग नियम कैसे निर्दिष्ट करें


144

मैं ऑटोमेपर ढांचे के लिए नौसिखिया हूं। मेरे पास एक डोमेन क्लास और एक डीटीओ क्लास इस प्रकार है:

public class Employee
{
   public long Id {get;set;}
   public string Name {get;set;}
   public string Phone {get;set;}
   public string Fax {get;set;}
   public DateTime DateOfBirth {get;set;}
}

public class EmployeeDto
{
   public long Id {get;set;}
   public string FullName {get;set;}
   public DateTime DateOfBirth {get;set;}
}

नोट: संपत्ति का नाम " नाम " Employeeवर्ग के समान नहीं है, क्योंकि संपत्ति " पूर्णनाम " EmployeeDtoवर्ग की है।

और यहाँ Employeeऑब्जेक्ट को मैप करने के लिए कोड है EmployeeDto:

Mapper.CreateMap<Employee, EmployeeDto>(); // code line (***)
EmployeeDto dto = Mapper.Map<Employee, EmployeeDto>(employee); 

मेरा प्रश्न है: यदि मैं मैप करना चाहते Employeeकरने के लिए (स्रोत वर्ग) EmployeeDto(गंतव्य वर्ग), मैं कैसे मानचित्रण नियम निर्दिष्ट कर सकते हैं? दूसरे शब्दों में, मुझे ऊपर कोड लाइन (***) के साथ अधिक कैसे करना चाहिए?

जवाबों:


292

कोई बात नहीं, मैंने खुद एक समाधान ढूंढा:

Mapper.CreateMap<Employee, EmployeeDto>()
    .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));

1
क्या किसी भी वर्ग के लिए विश्व स्तर पर इसे निर्दिष्ट करने का एक तरीका है, कुछ उपसर्ग / प्रत्यय जैसी चीज? उदाहरण के लिए, मेरे पास एक पुस्तकालय के लिए कक्षाओं का एक समूह है, जिनके पास "स्थानीयकरण" संपत्ति है। और मैं उन्हें उन वर्गों के लिए मैप करना चाहता हूं जहां संबंधित संपत्ति को "स्थानीयकृतनाम" कहा जाता है। क्या मेरा एकमात्र विकल्प प्रत्येक मैपिंग कॉन्फ़िगरेशन में ForMember जोड़ना है?
निकब

2
मैपर वर्ग में कोई CreateMap पद्धति नहीं है :(
Navid_pdp11

3
@ Navid_pdp11 हाँ है। आपको स्थिर श्रेणी मैपर की आवश्यकता नहीं है
जॉर्डन वैन आइजक जूल

@JordyvanEijk आप किस संस्करण का उपयोग कर रहे हैं जिसमें एक स्थिर "CreateMap" विधि है? 5.1.1.0 में ऐसी कोई बात है
मैट थॉमस

6
@MattThomas आटोमैपर के गीथूब पर एक नज़र डालने के बाद, मैं देखता हूं कि संस्करण 5.0 के रूप में क्रिएट मैप अप्रचलित है और वे कहते हैं कि आपको MapperConfiguration या Mapper.Initialize का उपयोग करने की आवश्यकता है।
जॉर्डन वैन आइजक

7

ऊपर दिए गए टिप्पणियों को स्वचालित अद्यतन में स्वचालित रूप से 8.1 + का उपयोग करके रोल करने के लिए ...

var mapConfig = new MapperConfiguration(
   cfg => cfg.CreateMap<Employee, EmployeeDto>()
      .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name))
);

तब आप मानचित्रकार का उपयोग करके मैपर का निर्माण करेंगे:

var mapper = mapConfig.CreateMapper();

2

हम मैपिंग के लिए क्लास की विशेषताओं पर भी निर्दिष्ट कर सकते हैं

से https://docs.automapper.org/en/stable/Conventions.html#attribute-support

सहायता प्रदान करें

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); * वर्तमान में हमेशा चालू है

SourceToDestinationMapperAttribute के गुणों और फ़ील्ड्स के लिए उदाहरणों को देखता है और उपयोगकर्ता द्वारा परिभाषित आइमैच फ़ंक्शन को सदस्य मैच खोजने के लिए कॉल करता है।

MapToAttribute उनमें से एक है जो प्रदान की गई नाम के आधार पर संपत्ति से मेल खाएगा।

public class Foo
{
    [MapTo("SourceOfBar")]
    public int Bar { get; set; }
}

जब कहीं और शब्दशः से सामग्री उद्धृत करते हैं, तो पाठकों को यह स्पष्ट करने के लिए ब्लॉक उद्धरण स्वरूपण का उपयोग करना सुनिश्चित करें कि सामग्री की प्रतिलिपि बनाई गई है।
टायलरह

नई शैली की जाँच करें :) docs.automapper.org/en/latest/Attribute-mapping.html
Lucian Bargaoanu

स्टैकओवरफ्लो के लिए बहुत नया। निश्चित रूप से नियमों का पालन करेंगे @TylerH
प्रणय DevOps
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.