2011-02-02 16 views
11

लंबी कहानी छोटी, मैं एमवीसी 2 और निनजेक्ट के साथ ईएलएमएएच का उपयोग करने की कोशिश कर रहा हूं, और मुझे पैरामीटर रहित कन्स्ट्रक्टर का उपयोग करने की आवश्यकता है। मैंने यहां इसके बारे में एक प्रारंभिक पोस्ट बनाया: Using a parameterless controller constructor with Ninject?कन्स्ट्रक्टर इंजेक्शन के बजाय प्रॉपर्टी इंजेक्शन का उपयोग

मुझे सलाहकार इंजेक्शन के बजाय संपत्ति इंजेक्शन का उपयोग करने की सलाह दी गई थी।

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository _departmentsRepository; 

    [Inject] 
    public IDepartmentsRepository DepartmentsRepository 
    { 
     get { return _departmentsRepository; } 
     set { _departmentsRepository = value; } 
    } 

    ... 
} 

लेकिन मेरे अन्य नियंत्रक कार्यों में, कि क्या मैं DepartmentsRepository या _departmentsRepository तक पहुँचने का प्रयास, मैं एक उदाहरण के लिए सेट नहीं एक वस्तु संदर्भ मिलता है:

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository departmentsRepository; 

    public DepartmentsController(IDepartmentsRepository departmentsRepository) 
    { 
     this.departmentsRepository = departmentsRepository; 
    } 

    ... 
} 
इस के लिए

: तो मैं इस से ले जाया गया किसी ऑब्जेक्ट की त्रुटि जब मैं इसे एक्सेस करने का प्रयास करता हूं।

क्या मुझे कुछ और करने की ज़रूरत है?

+6

क्या आप 'Ninject.Web.Mvc' का उपयोग कर रहे हैं? –

+2

क्या रुको? पैरामीटर रहित कन्स्ट्रक्टर का उपयोग करने के लिए आपको क्या आवश्यकता है? – jfar

+0

मुझे एक अजीब समस्या है जहां संपत्ति का एक विशिष्ट नाम होने पर एक विशेष निर्भरता हल नहीं होती है। अगर नाम बदल दिया गया तो यह ठीक काम करता है, लेकिन अन्य सभी निर्भरता सामान्य के रूप में हल होती है (और समान निर्भरता उसी संपत्ति नाम के लिए अन्य मामलों में ठीक हो जाती है)। मेरे पास कोई सुराग नहीं है, लेकिन यह हमेशा कोशिश करने के लिए कुछ है। –

उत्तर

2

ऑब्जेक्ट संदर्भ के लिए 2 कारण हो सकते हैं अपवाद सेट अप नहीं।

1) Ninject पता नहीं है DepartmentsRepository का एक ठोस कार्यान्वयन के लिए IDepartmentsRepository बाध्य करने के लिए कैसे (मुझे शक है कि इस मामले में हालांकि) है

2) आप अपने नियंत्रक के निर्माता में DepartmentsRepository संपत्ति का उपयोग करने की कोशिश कर रहे हैं, यह अपवाद फेंक दें (क्योंकि ऑब्जेक्ट केवल वस्तु के निर्माण के बाद संपत्ति निर्भरता को इंजेक्ट करने में सक्षम है)।

उम्मीद है कि मदद करता है।

10

मुझे एक ही समस्या थी। मेरे प्रश्नों पर एक नज़र डालें: Using Ninject with Membership.Provider

मूल रूप से जब आप DepartmentsController आरंभ आप अपने Ninject kernal में this (यानी अपने विभागों नियंत्रक इंजेक्षन करने की जरूरत है तो जैसे अपने कुछ:।।

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository _departmentsRepository; 

    [Inject] 
    public IDepartmentsRepository DepartmentsRepository 
    { 
    get { return _departmentsRepository; } 
    set { _departmentsRepository = value; } 
    } 

    public DepartmentsController() 
    { 
    NinjectHelper.Kernel.Inject(this); 
    } 
} 

कहाँ इस मामले में NinjectHelper हो जाता है वर्तमान Ninject कर्नेल

+6

यह काम करेगा, लेकिन इंस्ट्रक्शन करने के लिए नियंत्रक फैक्टरी का उपयोग करना बेहतर विचार है ताकि नियंत्रक को निनजेक्ट के बारे में पता न हो। –

3

Global.asax.cs

 protected void Application_Start() 
     { 
      DependencyResolver.SetResolver(
       new MyDependencyResolver(
        new StandardKernel(
         new MyModule()))); 
      //... 
     } 
:

कुछ इस तरह की कोशिश करो

MyDependencyResolver.cs

public class MyDependencyResolver : IDependencyResolver 
    { 
     private IKernel kernel; 

     public MyDependencyResolver(IKernel kernel) 
     { 
      this.kernel = kernel; 
     } 

     public object GetService(Type serviceType) 
     { 
      return kernel.TryGet(serviceType); 
     } 

     public IEnumerable<object> GetServices(Type serviceType) 
     { 
      return kernel.GetAll(serviceType); 
     } 
    } 

MyModule.cs

public class MyModule : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IDepartmentsRepository>().To<DepartmentsRepository>(); 
     } 
    } 
+0

यह प्रश्न का उत्तर कैसे मदद करता है? –

+1

@ डेव यह अपने ऑब्जेक्ट रेफरेंस को किसी ऑब्जेक्ट के उदाहरण पर सेट नहीं कर सकता है ... Ninject.Web.Mvc के लिए, मैंने कोशिश नहीं की। – frennky

0

के रूप में डैनियल टी में ऊपर टिप्पणी पोस्ट की है, तो आप बाहर Ninject.Web.Mvc जांच होनी चाहिए। यदि आप उस प्रोजेक्ट में NinjectHttp अनुप्रयोग का उपयोग करते हैं, तो यह आपके लिए सबकुछ स्वचालित कर देगा, ताकि जब निनजेकंट्रोलर फैक्ट्री एक नए नियंत्रक का निर्माण करे, तो यह इंजेक्शन() को इंजेक्शन() को आपके इंजेक्शन भरने के लिए कॉल करेगा।

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