2016-02-12 12 views
21

मैंने अपनी परियोजना में एक वैश्विक ऑटोमैपर कॉन्फ़िगरेशन परिभाषित किया था जो मुझे मेरे कोड में Mapper.Map<targetType>(sourceObject); का उपयोग करने की अनुमति देगा। (नीचे मेरी कॉन्फ़िगरेशन देखें।)ऑटोमैपर का कहना है Mapper.Map अप्रचलित, वैश्विक मैपिंग है?

मैंने NuGet पैकेज को अपडेट किया, और मुझे यह संदेश दिखाई देता है कि Mapper.Map अप्रचलित/अवमूल्यन है। मैं वापस चला गया GitHub पर Automapper और इस तरह उदाहरण देखने के लिए:

[Test] 
public void Example() 
{ 
    var config = new MapperConfiguration(cfg => 
    { 
     cfg.CreateMap<Source1, SubDest1>().FixRootDest(); 
     cfg.CreateMap<Source2, SubDest2>().FixRootDest(); 
    }); 

    config.AssertConfigurationIsValid(); 

    var mapper = config.CreateMapper(); 

    var subDest1 = mapper.Map<Source1, SubDest1>(new Source1 {SomeValue = "Value1"}); 
    var subDest2 = mapper.Map<Source2, SubDest2>(new Source2 {SomeOtherValue = "Value2"}); 

    subDest1.SomeValue.ShouldEqual("Value1"); 
    subDest2.SomeOtherValue.ShouldEqual("Value2"); 
} 

मैं हर विधि एक मानचित्रण का उपयोग करता है में एक विन्यास बनाने के लिए करने के लिए जा रहा हूं?

मेरे वर्तमान वैश्विक विन्यास:

namespace PublicationSystem.App_Start 
{ 
    public class AutoMapperConfig 
    { 
     public static void CreateMaps() 
     { 
      CreateProjectMaps(); 
     } 

     private static void CreateProjectMaps() 
     { 
      Mapper.CreateMap<Project, ProjectCreate>(); 
      Mapper.CreateMap<Project, ProjectSelectable>(); 
      //... 
     } 
    } 
} 

अद्यतन: धन्यवाद स्कॉट चेम्बरलेन से कुछ कोचिंग के लिए मैं इस तरह एक वर्ग बनाया है:

public class MkpMapperProfile : AutoMapper.Profile 
    { 
     protected override void Configure() 
     { 
      this.CreateMap<Project, ProjectCreate>(); 

      this.CreateMap<Project, ProjectSelectable>(); 

      this.CreateMap<Project, ProjectDetails>(); 

      // Many Many other maps 
     } 
    } 

मैं सोच रहा हूँ मैं चाहिए मेरे बेसकंट्रोलर कक्षा में 'मैपर कॉन्फ़िगरेशन' है। मैंने ऐसा कुछ करना शुरू किया:

public partial class BaseController : Controller 
{ 

    private MapperConfiguration mapConfig; 

    public BaseController() 
    { 
     db = new MkpContext(); 
     SetMapperConfig(); 
    } 

    private void SetMapperConfig() 
    { 
     mapConfig = new MapperConfiguration(cfg => 
      { 
       cfg.AddProfile<MkpMapperProfile>(); 
      }); 
    } 

    public BaseController(MapperConfiguration config) 
    { 
     db = new MkpContext(); 
     this.mapConfig = config; 
    } 
} 

क्या मैं सही रास्ते पर हूं?

+1

ऑटोमैपर विश्व स्तर पर स्कॉप्ड स्थिर कार्यों से दूर जा रहा है। यह विभिन्न लेखकों द्वारा लिखित पुस्तकालयों को एक दूसरे के साथ हस्तक्षेप किए बिना ऑटोमैपर का उपयोग करने की अनुमति देता है। –

+1

मुझे यकीन नहीं है कि मेरे लिए इसका क्या अर्थ है। मुझे यहां और वहां जानकारी के बिट मिल रहे हैं, लेकिन यह मेरे लिए पूरी तस्वीर नहीं बना रहा है। मैंने इसे पढ़ लिया है: https://github.com/AutoMapper/AutoMapper/wiki/Migrating-from-static-API लेकिन यह समझ में नहीं आता है। क्या मुझे ऑटोमैपर का उपयोग करने वाले प्रत्येक ActionResult में कॉन्फ़िगरेशन को परिभाषित करने की आवश्यकता है? मैं इसे एक डेटालियर में ले जा सकता हूं ... और मेरे ऐप में 'एमवीसी एप्लीकेशन' मैपर कॉन्फ़िगरेशन 'प्रतीत नहीं होता है। यह कहां परिभाषित किया गया है? –

+0

आप एक बनाते हैं, मूल रूप से 'प्रोफ़ाइल' से प्राप्त कक्षा बनाते हैं, 'कॉन्फ़िगर()' फ़ंक्शन को ओवरराइड करते हैं, फिर अपने 'CreateProjectMaps' में पेस्ट करें लेकिन 'Map.' –

उत्तर

35

इस तरह मैंने इसे संभाला है।

एक प्रोफाइल में नक्शे बनाएं, एक ही नाम के मैपर के स्थिर विधि प्रोफ़ाइल के CreateMap विधि के बजाय का उपयोग करने के देखभाल: फिर

internal class MappingProfile : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<Project, ProjectCreate>(); 
    } 
} 

, जहाँ भी निर्भरता रहे हैं तार-अप (पूर्व: Global.asax या स्टार्टअप), मैपर कॉन्फ़िगरेशन बनाएं और उसके बाद IMAPper बनाने के लिए इसका उपयोग करें। , तब

var mapper = mapperConfiguration.CreateMapper(); 

,

builder.RegisterInstance(mapper).As<IMapper>(); 

(मैं यहाँ Autofac उपयोग कर रहा हूँ) अब रजिस्टर निर्भरता निर्माता के साथ कि नक्शाकार:

var mapperConfiguration = new MapperConfiguration(cfg => 
    { 
     cfg.AddProfile(new MappingProfile()); 
    }); 

फिर, एक IMapper उत्पन्न करने के लिए विन्यास का उपयोग जहां भी आपको सामान मैप करने की आवश्यकता है, IMAPper पर निर्भरता घोषित करें:

internal class ProjectService : IProjectService { 
    private readonly IMapper _mapper; 
    public ProjectService(IMapper mapper) { 
     _mapper = mapper; 
    } 
    public ProjectCreate Get(string key) { 
     var project = GetProjectSomehow(key); 
     return _mapper.Map<Project, ProjectCreate>(project); 
    } 
} 
+3

ध्यान दें कि ऑटोमैपर 5.0 में मैपिंग प्रोफाइल confi केवल कन्स्ट्रक्टर में संभाला जाता है। अब और ओवरराइड करने की जरूरत नहीं है। –

2

तुम मेरे ASP.NET MVC खाका परियोजना यहाँ AutoMapper 4.2 कॉन्फ़िगर किया गया पा सकते हैं: IMapFrom<> साथ https://github.com/NikolayIT/ASP.NET-MVC-Template/tree/master/ASP.NET%20MVC%205/Web/MvcTemplate.Web.Infrastructure/Mapping

  • एन्नोटेट दृश्य मॉडल: https://github.com/NikolayIT/ASP.NET-MVC-Template

    1. इन कक्षाओं बनाएं https://github.com/NikolayIT/ASP.NET-MVC-Template/blob/master/ASP.NET%20Core/Web/AspNetCoreTemplate.Web/ViewModels/Settings/SettingViewModel.cs

    2. उपयोग यह .To<SomeViewModel>() के रूप में। उदाहरण: https://github.com/NikolayIT/ASP.NET-MVC-Template/blob/master/ASP.NET%20MVC%205/Web/MvcTemplate.Web/Controllers/HomeController.cs#L27

  • +0

    ये लिंक अब और मौजूद नहीं हैं? –

    +0

    @ अक्षयंद, धन्यवाद, वे अब तय हैं। –

    7

    यह ऑटोमैपर 4.2 में नया है। जिमी बोगर्ड द्वारा इस पर एक ब्लॉग पोस्ट है: Removing the static API from AutoMapper।उसका दावा है कि

    IMapper इंटरफ़ेस एक बहुत हल्का होता है, और अंतर्निहित प्रकार अब सिर्फ नक्शे को क्रियान्वित करने, थ्रेडिंग समस्याओं का एक बहुत दूर करने के साथ संबंध है ...

    नई वाक्य रचना: (ब्लॉग पोस्ट से चिपकाया)

    var config = new MapperConfiguration(cfg => { 
        cfg.CreateMap<User, UserDto>(); 
    }); 
    

    तुम सिर्फ ऐसा करने का "पुराना तरीका" चाहते हैं। नवीनतम संस्करण 4.2.1 ने कुछ परंपरा वापस लाई है। बस

    Mapper.CreateMap<Project, ProjectCreate>(); 
    

    पुराने कोड के बजाय

    CreateMap<Project, ProjectCreate>(); 
    

    का उपयोग ठीक से काम करेगा।

    1
    Mapper.Initialize(cfg => { 
        cfg.CreateMap<Source, Dest>(); 
    }); 
    
    6

    मैं संस्करण 5.2.0 का उपयोग कर रहा हूं, कॉन्फ़िगरेशन में नक्शा बनाने के बजाय समर्थन को ओवरराइड करने के बजाय समर्थन करता हूं।

    Mapper.Initialize(c=>c.AddProfile<MappingProfile>()); 
    

    आशा इस मदद:

    public class MappingProfile : Profile 
    { 
        public MappingProfile() 
        { 
         CreateMap<Project, ProjectDto>(); 
        } 
    } 
    
    तरह Global.asax.cs कॉल में

    +0

    यदि आपको गतिशील रूप से प्रोफाइल जोड़ने की आवश्यकता है 'Mapper.Initialize (c => c.AddProfiles (नई स्ट्रिंग [] {"DLL_NAME"}); '' – JenonD

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