2016-02-05 8 views
11

मैं ऑटोमैपर 4.2 का उपयोग करने के लिए मेरा एक प्रोजेक्ट अपडेट कर रहा हूं, और मैं परिवर्तनों को तोड़ने में दौड़ रहा हूं। जबकि प्रतीत होता है कि संकल्प में हल करने के लिए प्रतीत होता है, मैं पूरी तरह से आश्वस्त नहीं हूं कि मैंने इसे सबसे उचित तरीके से किया है।ऑटोमैपर 4.2 और निनजेक्ट 3.2

पुराने कोड में, मेरे पास NinjectConfiguration है, और AutoMapperConfiguration कक्षा है जो प्रत्येक वेबएक्टिवेटर द्वारा लोड की जाती है। नए संस्करण में AutoMapperConfiguration बाहर चला जाता है और मैं बजाय NinjectConfiguration वर्ग जहां बाइंडिंग हो रही हैं में उदाहरण के एक MapperConfiguration सीधे, इसलिए जैसे:

private static void RegisterServices(
    IKernel kernel) { 
    var profiles = AssemblyHelper.GetTypesInheriting<Profile>(Assembly.Load("???.Mappings")).Select(Activator.CreateInstance).Cast<Profile>(); 
    var config = new MapperConfiguration(
     c => { 
      foreach (var profile in profiles) { 
       c.AddProfile(profile); 
      } 
     }); 

    kernel.Bind<MapperConfiguration>().ToMethod(
     c => 
      config).InSingletonScope(); 

    kernel.Bind<IMapper>().ToMethod(
     c => 
      config.CreateMapper()).InRequestScope(); 

    RegisterModules(kernel); 
} 

तो, यह AutoMapper 4.2 बाध्यकारी Ninject का उपयोग करने का उचित तरीका है? ऐसा लगता है कि अब तक काम कर रहा है, लेकिन मैं बस यह सुनिश्चित करना चाहता हूं।

उत्तर

14

लाइब्रेरी में IMapper इंटरफ़ेस मौजूद नहीं था, इसलिए आपको नीचे इंटरफ़ेस और कक्षा लागू करना था और उन्हें सिंगलटन पैटर्न के रूप में बाध्य करना था।

public interface IMapper 
{ 
    T Map<T>(object objectToMap); 
} 

public class AutoMapperAdapter : IMapper 
{ 
    public T Map<T>(object objectToMap) 
    { 
     //Mapper.Map is a static method of the library! 
     return Mapper.Map<T>(objectToMap); 
    } 
} 

अब आप बस mapperConfiguration.CreateMapper()

अपने कोड यद्यपि के साथ समस्या का एक उदाहरण के लिए लाइब्रेरी की IMapper इंटरफ़ेस बाँध, आप (या एक निरंतर रूप Ninject कहते हैं,) बाँध एक उदाहरण का उपयोग करना चाहिए ।

// A reminder 
var config = new MapperConfiguration(
    c => { 
     foreach (var profile in profiles) { 
      c.AddProfile(profile); 
     } 
    }); 
// Solution starts here 
var mapper = config.CreateMapper(); 
kernel.Bind<IMapper>().ToConstant(mapper); 
+0

तो 'इनरक्वेटस्कोप()' के बजाय इसे 'इनिंगिंगटनस्कोप() 'होना चाहिए? अन्यथा बाइंडिंग ठीक है? – Gup3rSuR4c

+0

@Alex क्षमा करें कोड नमूना भूल गए, इसे जोड़ा। –

+0

ग्रेट, यह मेरी समस्या हल हो गया। –

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