2010-11-03 11 views
5

मेरे पास एक कक्षा है जिसे इसकी कक्षा में एक विधि के लिए एक आईरिपोजिटरी का उपयोग करने की आवश्यकता है।निनजेक्ट के साथ विधि इंजेक्शन का उपयोग कैसे करते हैं?

आदर्श रूप से, मैं कक्षा के निर्माता में इस निर्भरता को हल करने से बचाना चाहता हूं, और इसलिए मुझे निनजेक्ट में विधि स्तर इंजेक्शन मिला और यह सोच रहा था कि यह कैसे काम करता है?

मैं समझता हूं कि इसे कैसे सेट अप करें। मैं इस बारे में उलझन में हूं कि इसे कैसे कॉल करें?

उदाहरण:

class SomeClassThatUsesRepository 
{ 
    [Inject] 
    public void QueryForSomeStuff(IRepository repository) 
    { 
     //do some stuff 
    } 
} 

मेरे समस्या कैसे मैं एक IRepository निर्दिष्ट किए बिना इस पद्धति कहते हैं है?

var someClass = Kernel.Resolve<SomeClassThatUsesRepository>(); 

काम करेगा अगर मैं निर्माता का उपयोग कर रहा था, लेकिन मैं एक विधि कॉल करना चाहता हूं।

निनजेक्ट विधि इंजेक्शन का उपयोग करके मैं एक विधि कैसे कॉल करूं?

उत्तर

12

मुझे डर है कि विधि इंजेक्शन इस तरह से काम नहीं करता है - यह केवल निर्माण के दौरान किसी ऑब्जेक्ट में निर्भरता को इंजेक्ट करने के तरीकों में से एक है (आप गुणों, फ़ील्ड या विधियों के माध्यम से कन्स्ट्रक्टर पैरामीटर के माध्यम से अपनी निर्भरताओं को इंजेक्ट कर सकते हैं)। विधि इंजेक्शन उपयोगी है अपने वर्ग की तरह

public void SetRepository(IRepository repository) { ... } 

जावा शैली सेटर तरीकों से अपनी निर्भरता लेता है अगर यह [Inject] विशेषता के साथ चिह्नित है, तो आप, इस तरीकों सीधे कॉल की जरूरत नहीं है यह Ninject द्वारा कहा जा रहा है IRepository ऑब्जेक्ट को आपके हल किए गए ऑब्जेक्ट में पास करने के प्रारंभ के दौरान।

तो मेरा मानना ​​है कि आपके QueryForSomeStuff विधि को कॉल किया जा रहा है जब आप अपना SomeClassThatUsesRepository पुन: प्राप्त करते हैं।

+0

+1 महान स्पष्टीकरण। मैं केवल उल्लेख करता हूं कि यह दो चरण निर्माण की नकल करता है - यानी, जैसा कि विधि को प्रारंभ किया गया था() –

0

पुष्टि की है कि विधि इंजेक्शन इरादे के अनुसार काम नहीं करता है। एक कस्टम एमवीसी विशेषता वर्ग मिला और इसके अंदर एक इंजेक्शन वस्तु का उपयोग करना चाहता था। यह में सफल नहीं हुए निर्माता और कहा कि विधि

[Ninject.Inject] 
public void ResolveDI(ISettingStore store) 
{ 
    ConfigHelper = store; 
} 

इस विधि कभी नहीं बुलाया गया था और ConfigHelper अशक्त था जब विशेषता के OnActionExecuting बुलाया गया था में।

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