2016-08-21 9 views
5

मेरे पास कुछ एएसपी.Net ऐप्स हैं जो मैपिंग कोड साझा करते हैं, इसलिए मैंने एक सामान्य ऑटोमैपर इनिट क्लास बनाया है।आरंभ करने के बाद ऑटोमैपर में मैपिंग कैसे जोड़ सकता हूं?

हालांकि, मेरे ऐप्स में से एक में, मेरे पास कुछ विशिष्ट वर्ग हैं जिन्हें मैं कॉन्फ़िगरेशन में जोड़ना चाहता हूं।

मैं निम्नलिखित कोड:

public class AutoMapperMappings 
{ 
    public static void Init() 
    { 
     AutoMapper.Mapper.Initialize(cfg => 
     { 
      ... A whole bunch of mappings here ... 
     } 
    } 
} 

और

// Call into the global mapping class 
AutoMapperMappings.Init(); 

// This erases everything 
AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap<CustomerModel, CustomerInfoModel>()); 

मैं नष्ट क्या पहले से ही आरंभ नहीं हो जाता बिना इस अनूठी मानचित्रण कैसे जोड़ सकता हूँ?

उत्तर

7

एक त्वरित नमूना है कि आप अपने AutoMapper 5.x कई बार प्रारंभ करने की अनुमति देता है ... ठीक है यह बहुत अच्छा नहीं है;)

public static class MapperInitializer 
{ 
    /// <summary> 
    /// Initialize mapper 
    /// </summary> 
    public static void Init() 
    { 
     // Static mapper 
     Mapper.Initialize(Configuration); 

     // ...Or instance mapper 
     var mapperConfiguration = new MapperConfiguration(Configuration); 
     var mapper = mapperConfiguration.CreateMapper(); 
     // ... 
    } 

    /// <summary> 
    /// Mapper configuration 
    /// </summary> 
    public static MapperConfigurationExpression Configuration { get; } = new MapperConfigurationExpression(); 
} 

// First config 
MapperInitializer.Configuration.CreateMap(...); 
MapperInitializer.Init(); // or not 

//... 
MapperInitializer.Configuration.CreateMap(...); 
MapperInitializer.Init(); 

विचार MapperConfiguration उदाहरण के बजाय MapperConfigurationExpression स्टोर करने के लिए है।

2

यदि आप आवृत्ति एपीआई के बजाए ऑटोमैपर प्रदान करते हैं तो आवृत्ति एपीआई का उपयोग करना संभव होना चाहिए। This wiki page दोनों के बीच मतभेदों का विवरण देता है।

मूलतः बजाय अपने अतिरिक्त मानचित्रण है, जो कि एक मानचित्रण के साथ पूरे वैश्विक नक्शाकार विन्यास अधिलेखित कर देता है के लिए फिर से AutoMapper.Mapper.Initialize(cfg => ...) बुलाने की, तो आप का उपयोग कर उदाहरण एपीआई के साथ एक और नक्शाकार वस्तु बनाने के लिए की आवश्यकता होगी:

var config = new MapperConfiguration(cfg => 
    cfg.CreateMap<CustomerModel, CustomerInfoModel>() 
); 
var mapper = config.CreateMapper(); 
के

इस नए मैपर का उपयोग करने के लिए आपको var mappedModel = mapper.Map<CustomerInfoModel>(new CustomerModel()); जैसे कुछ करना होगा विशेष रूप से जब आपके अतिरिक्त मैपिंग कॉन्फ़िगरेशन का उपयोग करके ऑब्जेक्ट्स मैप करना होगा। चाहे वह आपके मामले में व्यावहारिक है, मुझे नहीं पता, लेकिन मेरा मानना ​​है कि आपको जो चाहिए वह करने का यही एकमात्र तरीका है।

0

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

तो, अपने Init विधि इस प्रकार है:

public static Action<IMapperConfigurationExpression> Init() 
{ 
    return (cfg) => { 
     ... A whole bunch of mappings here ... 
    }; 
} 
फिर अपने app से

जहां अतिरिक्त मैपिंग हैं:

var mappingsFunc = MyClass.Init(); 

Mapper.Initialize((cfg) => { 
    mappingsFunc(cfg); 
    ... Extra mappings here ... 
}); 

या आप इसे एक छोटे से कम हो सकता है ...

Mapper.Initialize((cfg) => { 
    MyClass.Init()(cfg); 
    ... Extra mappings here ... 
}); 

उम्मीद है कि इससे मदद मिलती है।

0

Automapper 5 +

मैं प्रत्येक विधानसभा कि एक मैपर की आवश्यकता है में

public static class Mapping 
{ 
    public static void Initialize() 
    { 
     // Or marker types for assemblies: 
     Mapper.Initialize(cfg => 
      cfg.AddProfiles(new[] { 
       typeof(MapperFromImportedAssemblyA), 
       typeof(MapperFromImportedAssemblyB), 
       typeof(MapperFromImportedAssemblyC) 
      }) 
      ); 
    } 
} 

फिर अपने मुख्य विधानसभा में एक initialiser वर्ग है

public class MapperFromImportedAssemblyA : Profile 
{ 
    public MapperFromImportedAssemblyA() 
    { 
     // Use CreateMap here (Profile methods are the same as configuration methods) 
    } 
} 
संबंधित मुद्दे