2010-11-27 13 views
10

एमवीसी के लिए बेस कंट्रोलर में, मेरे पास निम्न इंजेक्शन कोड था और यह पूरी तरह से काम कर रहा था।निनजेक्ट ने मेरी प्रॉपर्टी इंजेक्शन रोक दी

[Inject] 
private INavigationRepository navigationRepository { get; set; } 
[Inject] 
private ISessionService sessionService { get; set; } 

मुझे क्या करना त्रुटियों का निर्माण नहीं हो और यह के रूप में मौत का येलो पेज में उतार चलता "System.NullReferenceException:। एक वस्तु का एक उदाहरण के लिए सेट नहीं ऑब्जेक्ट संदर्भ" और नेविगेशन रिपॉजिटरी संदर्भ कोड की पहली पंक्ति को इंगित करता है।

मेरे पास काम करने के बाद से बहुत कम कोड परिवर्तन हो सकते हैं और यहां तक ​​कि उन परिवर्तनों का समर्थन भी किया है लेकिन फिर भी त्रुटि प्राप्त हो रही है। मैं नीचे दिए गए कोड के साथ इसके आसपास हो सकता हूं लेकिन मैं इंजेक्शन खो देता हूं। इस से निपटने के तरीके पर कोई विचार?

private INavigationRepository navigationRepository; 
    private ISessionService sessionService; 
    public BaseController() 
    { 
     navigationRepository = new NavigationRepository(); 
     sessionService = new SessionService(new VolunteerRepository()); 
    } 

उत्तर

33

निनजा निजी गुणों को इंजेक्ट कर सकता है लेकिन इसे सक्षम होना चाहिए।

new StandardKernel(new NinjectSettings() { InjectNonPublic = true }) 

लेकिन बेहतर इंजेक्शन का उपयोग नहीं करना बेहतर है। इसका उपयोग केवल तभी किया जाना चाहिए जब इससे बचने का कोई तरीका न हो। जैसे अगर इंजेक्शन किसी और द्वारा बनाया गया है (विशेषता फ़िल्टर)। अन्यथा निर्भरताओं को बाहर से अनजाने में सेट किया जा सकता है और आपको इंजेक्ट विशेषता की आवश्यकता होती है जो आपको आईओसी कंटेनर का संदर्भ देता है। मैं कन्स्ट्रक्टर को निर्भरता जोड़ने और कन्स्ट्रक्टर इंजेक्शन का उपयोग करने का सुझाव दूंगा।

+0

+1 अच्छा उत्तर। और, वैसे, उत्कृष्ट काम के लिए धन्यवाद जो आप हाल ही में निनजेक्ट के साथ कर रहे हैं, रेमो। – StriplingWarrior

+0

दूसरा @StriplingWarrior की टिप्पणी। डीआई के बारे में सबसे महत्वपूर्ण बिंदुओं में से एक के रूप में इसे +1 करें। –

+2

प्रोप इंजेक्शन पर पकड़े हुए एक चीज मुझे इस बारे में नहीं मिली है कि यदि आपके पास बेस क्लास पर 4 चीजें हैं जिन्हें इंजेक्शन की आवश्यकता है और आप उन्हें व्युत्पन्न कक्षाओं पर मजबूर नहीं करना चाहते हैं, तो जवाब यह है कि आपके पास एक लापता अवधारणा है जो होना चाहिए एक वर्ग में encapsulated - प्रोप इंजेक्शन से दूर refactor करने के लिए उपयोग करें। IOW संपत्ति इंजेक्शन हमेशा एक बुरा विचार है - आप jsut से दूर refacotr दूर करने के लिए पर्याप्त कोशिश कर रहे हैं। इसका कहना बहुत आसान है "लेकिन मेरे मामले में यह अलग है - मेरे पास ग्रह पर विशेष मामला है जो पीआई के अस्तित्व को न्यायसंगत बनाता है" –

1

संपत्तियों को सार्वजनिक काम में बदलना। मुझे लगता है कि यह निजी है, निनजा इसे सेट नहीं कर सकता है।

[Inject] 
public INavigationRepository navigationRepository { get; set; } 
[Inject] 
public ISessionService sessionService { get; set; } 
+3

क्या आप इसे अपने प्रश्न में संपादित कर सकते हैं या उत्तर पर टिप्पणी कर सकते हैं? और इसे सही दिखने के लिए CtrlK के साथ कोड 4 को इंडेंट करना न भूलें –

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