दिलचस्प पोस्ट
कुडा सी – लिंकर त्रुटि – अनिर्धारित संदर्भ उपयोगकर्ता से हस्ताक्षर का उपयोग करते हुए किसी सर्वर दस्तावेज़ पर पीडीएफ़ पर हस्ताक्षर करना सीएसएस में पहला अक्षर अपरकेस बनायें 1/3 = 0 का परिणाम क्यों है? डीआईवी के बजाय टेबल्स स्थानीय मशीन पर PHP सर्वर? क्या जावा में एक विधि के हस्ताक्षर में इसका वापसी प्रकार शामिल है? क्या C ++ में एक उत्पादन तैयार ताला मुक्त कतार या हैश कार्यान्वयन है? रूबी में एक अमूर्त वर्ग को कैसे कार्यान्वित करें? पायथन कैसे एक बार में लाइनों की संख्या को पढ़ने के लिए PHP के साथ पीडीएफ फाइल मर्ज करें IOS अनुप्रयोग द्वारा एक उपकरण पर बनाई गई फ़ाइलों को ब्राउज़ करें, मैं वर्कस्टेशन पर विकासशील हूं? कोणीय 2: टाइपअर्रर: एपीकॉम्पनेन्ट @ में [{{thing.title}} में l_thing0 अपरिभाषित है jquery लोड होने पर iframe सामग्री की ऊंचाई मिलता है Linq: "या" समकक्ष कहाँ ()

कंस्ट्रक्टर में अतिरिक्त पैरामीटर के साथ Ninject का उपयोग करके एक उदाहरण बनाना

मैंने नाइनगे का उपयोग करना शुरू करने का फैसला किया और एक समस्या का सामना करना कहें कि मेरे पास यह परिदृश्य है मेरे पास एक IService इंटरफ़ेस और 2 वर्ग इस इंटरफ़ेस को लागू करना है। और मेरे पास एक क्लास भी है, जिसकी एक कन्स्ट्रक्टर IService और एक इंट हो रहा है । मैं कैसे इस कक्षा का एक उदाहरण बना सकता हूँ Ninject (मैं इस int hardwire नहीं करना चाहते, मैं इसे हर बार एक उदाहरण प्राप्त करना चाहते हैं)?

स्थिति का वर्णन करने वाला कुछ कोड है:

 interface IService { void Func(); } class StandardService : IService { public void Func() { Console.WriteLine("Standard"); } } class AlternativeService : IService { public void Func() { Console.WriteLine("Alternative"); } } class MyClass { public MyClass(IService service, int i) { this.service = service; } public void Func() { service.Func(); } IService service = null; } class Program { static void Main(string[] args) { IKernel kernel = new StandardKernel(new InlineModule( x => x.Bind<IService>().To<AlternativeService>(), x => x.Bind<MyClass>().ToSelf())); IService service = kernel.Get<IService>(); MyClass m = kernel.Get<MyClass>(); m.Func(); } } 

वेब के समाधान से एकत्रित समाधान "कंस्ट्रक्टर में अतिरिक्त पैरामीटर के साथ Ninject का उपयोग करके एक उदाहरण बनाना"

साथ। With.ConstructorArgument 1.0 के लिए इस उद्देश्य से मौजूद था। 2.0 में, सिंटैक्स थोड़ा बदल गया है: – साथ। पैरामीटर। कॉन्सेस्ट्रक्टरआर्कगमेंट के साथ ninject 2.0

इंजेक्शन निर्भरता में मूल्य को अधिक विवरण और उदाहरणों, प्रदाताओं और तर्कों का उपयोग करने के उदाहरणों के लिए इंजेक्शन देखें, जैसे सामान को और अधिक सही ढंग से पास करें

संपादित करें: जैसा कि स्टीवन ने मेरी टिप्पणी का ढोंग करने के लिए चुना है, वह अप्रासंगिक है, मैं सबसे स्पष्ट कर दूंगा कि मैं कुछ उदाहरणों (2.0 के लिए) कह रहा हूं:

 MyClass m = kernel.Get<MyClass>( new ConstructorArgument( "i", 2) ); 

जो मेरी आँखों के लिए बहुत स्पष्ट है और बताता है कि वास्तव में क्या हो रहा है।

यदि आप ऐसी स्थिति में हैं जहां आप अधिक वैश्विक तरीके से पैरामीटर निर्धारित कर सकते हैं तो आप एक प्रदाता को पंजीकृत कर सकते हैं और इसे ऐसा कर सकते हैं:

 class MyClassProvider : SimpleProvider<MyClass> { protected override MyClass CreateInstance( IContext context ) { return new MyClass( context.Kernel.Get<IService>(), CalculateINow() ); } } 

और इसे इस तरह पंजीकृत करें:

 x => x.Bind<MyClass>().ToProvider( new MyClassProvider() ) 

एनबी कैलक्यूटिनो CalculateINow() बिट है, जहां आप पहले तर्क में अपने तर्क में डालते थे।

या इसे और अधिक जटिल बनाओ:

 class MyClassProviderCustom : SimpleProvider<MyClass> { readonly Func<int> _calculateINow; public MyClassProviderCustom( Func<int> calculateINow ) { _calculateINow = calculateINow; } protected override MyClass CreateInstance( IContext context ) { return new MyClass( context.Kernel.Get<IService>(), _calculateINow() ); } } 

जो आप इस तरह रजिस्टर करेंगे:

 x => x.Bind<MyClass>().ToProvider( new MyClassProviderCustom( ( ) => new Random( ).Next( 9 ) ) ) 

अद्यतन: ऊपर की तुलना में कम बॉयलरप्लेट के साथ अधिक सुधार किए गए पैटर्न का प्रदर्शन करने वाले नए तंत्र Ninject.Extensions.Factory एक्सटेंशन। Ninject.Extensions.Factory एक्सटेंशन, देखें: https://github.com/ninject/ninject.extensions.factory/wiki

जैसा कि पहले कहा गया है, अगर आपको हर समय एक अलग पैरामीटर देना पड़ता है और आपके पास निर्भरता ग्राफ़ में कई स्तर हैं, तो आपको ऐसा कुछ करने की आवश्यकता हो सकती है ।

एक अंतिम विचार यह है कि क्योंकि आपने Using<Behavior> नहीं किया है, तो यह तयशुदा रूप से तयशुदा रूप से तयशुदा रूप से कर्नेल के लिए विकल्पों में निर्दिष्ट / डिफ़ॉल्ट रूप से तय हो रहा है, जो कि वास्तव में तथ्य प्रदान कर सकता है कि फ़ैक्ट्री i परिकलन करता है मक्खी मुनाफा [उदाहरण के लिए, यदि वस्तु को कैश्ड किया जा रहा था]

अब, उन टिप्पणियों में कुछ अन्य बिंदुओं को स्पष्ट करने के लिए, जिन्हें फ्यूड किया गया है और उन पर चमक दी गई है। डीआई का उपयोग करने के बारे में कुछ महत्वपूर्ण बातों को ध्यान में रखना, इसे निन्गिन करना या जो कुछ भी है:

  1. जितना संभव हो कन्स्ट्रक्टर इंजेक्शन द्वारा किया जाता है ताकि आपको कंटेनर विशिष्ट विशेषताओं और चालें उपयोग करने की आवश्यकता न हो। आपके IoC कंटेनर नामक एक अच्छा ब्लॉग पोस्ट दिखा रहा है ।

  2. कंटेनर में जाकर कम से कम कोड और सामानों के लिए पूछना – अन्यथा आपके कोड को क) एक विशिष्ट कंटेनर (जो सीएसएल कम कर सकता है) ख) जिस तरह से आपकी पूरी परियोजना को निर्धारित किया गया है ऐसे अच्छे ब्लॉग पोस्ट हैं जो यह दिखाते हैं कि सीएसएल ऐसा नहीं कर रहा है जो आपको लगता है कि यह ऐसा करता है। यह सामान्य विषय सेवा स्थान बनाम निर्भरता इंजेक्शन के रूप में संदर्भित है। अद्यतनः विस्तृत और पूर्ण तर्क के लिए http://blog.ploeh.dk/2011/07/28/CompositionRoot.aspx देखें।

  3. स्थिरता और गीतकारों का उपयोग कम करें

  4. मान लीजिए कि केवल एक [वैश्विक] कंटेनर नहीं है और यह जब भी आपको एक अच्छी वैश्विक वैरिएबल की तरह इसकी ज़रूरत है, तो इसे ठीक करना ठीक है। कई मॉड्यूल और Bind.ToProvider() का सही उपयोग आपको इसे प्रबंधित करने के लिए एक संरचना देता है। इस तरह से प्रत्येक अलग सबसिस्टम अपने आप पर काम कर सकता है और आप निम्न-स्तरीय अवयवों को उच्च-स्तरीय घटकों से बंधे हैं, आदि।

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

अब, अगर केवल जोएल आ सकता है और वास्तव में मुझे वाकई अच्छा सिंटैक्स और / या यह करने के लिए सही तरीके से सेट कर रहा है!

अद्यतनः हालांकि यह जवाब स्पष्ट रूप से उपयोगी है, जो इसे बढ़ाए गए हैं, मैं निम्न अनुशंसाएं करना चाहता हूं:

  • उपर्युक्त लगता है क्योंकि यह थोड़ा सा दिनांक है और ईमानदारी से बहुत सी अधूरी सोच को दर्शाता है जो लगभग निस्संदेह इंजेक्शन पढ़ने से शर्मिंदगी महसूस करता है – चलें और इसे अब खरीदें – यह केवल डी के बारे में नहीं है, पहली छमाही का पूरा इलाज है सभी वास्तुकला इसके आस-पास के एक व्यक्ति से चिंतित हैं, जिसने यहां निर्भरता इंजेक्शन टैग के आसपास लटकाकर बहुत समय बिताया है।
  • यहां पर मार्क सीमैन की शीर्ष रेटेड पोस्ट्स को अभी पढ़िए – आप हर एक से मूल्यवान तकनीक सीखेंगे