Prevent Ninject from calling Initialize multiple times when binding to several interfaces -


हमारे पास एक ठोस सिंगलटन सेवा है जो ninject.III initialitialable और 2 इंटरफेस लागू करती है। समस्या यह है कि शुरूआत-मेथोडोड को 2 बार कहा जाता है, जब केवल एक ही वांछित होता है हम .NET 3.5 और Ninject 2.0.0.0 का प्रयोग कर रहे हैं।

क्या निन्जेन्ग में कोई पैटर्न ऐसा होने से रोकता है? न तो इंटरफेस को लागू Ninject.IInitializable । सेवा वर्ग है:

  सार्वजनिक वर्ग कंक्रीट सेवा: IService1, IService2, Ninject.IInitializable {सार्वजनिक शून्य प्रारंभ () {// यह दो बार कहा जाता है! }}  

और मॉड्यूल इस तरह दिखता है:

  सार्वजनिक वर्ग सेवा मॉड्यूल: NinjectModule {सार्वजनिक ओवरराइड शून्य लोड () {this.Singleton & lt; Iservice1, Iservice2, ConcreteService & gt; (); }}  

जहां सिंगलटन एक विस्तार विधि है जो कि इस तरह परिभाषित है:

  सार्वजनिक स्थिर शून्य सिंगलटन & lt; K, T & gt; (यह निन्जा मॉड्यूल मॉड्यूल) जहां टी: K {module.Bind & lt; K & gt; ()। & Lt; T & gt; ()। InSingletonScope (); } सार्वजनिक स्थैतिक शून्य सिंगलटन & एलटी; के, एल, टी & gt; (यह निन्जा मॉड्यूल मॉड्यूल) जहां टी: के, एल {सिंगलटन और एलटी; के, टी & gt; (मॉड्यूल); मॉड्यूल.बंड & lt; L & gt; ()। ToMethod (n = & gt; n.Kernel.Get & lt; T & gt; ()); }  

बेशक हम bool initialized-member को कंक्रीट सेवा में जोड़ सकते हैं और केवल जब वह झूठी शुरू होती है, लेकिन यह एक हैक का बहुत सा लगता है। और इसे दो या अधिक इंटरफेस लागू करने वाली प्रत्येक सेवा में एक ही तर्क को दोहराने की आवश्यकता होगी।


सभी उत्तरों के लिए धन्यवाद! मैं उन सभी में से कुछ सीखा! (मुझे यह तय करने में कठिन समय आ रहा है कि कौन सा एक निशान सही है)।

हमने IActivable इंटरफ़ेस बनाने और ninject कर्नेल को विस्तारित करना समाप्त कर दिया (यह भी अच्छी तरह से कोड स्तर निर्भरता को निकालने के लिए ninject, allthough विशेषताओं को अभी भी बना रहता है)।

निन्जेक 3

Ninject 3.0 अब बाइंड करने के लिए कॉल में कई सामान्य प्रकारों का समर्थन करता है , आप जो भी करने की कोशिश कर रहे हैं, वह आसानी से एक ही संरेखित बयान में पूरा किया जा सकता है।

  कर्नेल.बंड & lt; IService1, IService2 & gt; ()। & Lt; कंक्रीट सेवा & gt; () .सिलिंगनस्स्कोप ();  

निन्जेक 2

आप दो अलग बाइंडिंग की स्थापना कर रहे हैं K => T और L => T एल के उदाहरणों का अनुरोध करना टी के क्षणिक उदाहरण लौटाएंगे। कश्मीर के अनुरोध को एक सिंगलटन उदाहरण देगा।

एनआईएक्स 2.0 में, एक ऑब्जेक्ट गुंजाइश एक स्कोप कॉलबैक तक ही सीमित है।

< P> जब आपके पास

  बाध्य & lt; IFoo & gt; ... InSingletonScope (); बाइंड करें & lt; Ibar & gt; ... InSingletonScope ();  

आप दो अलग-अलग स्कोप बना रहे हैं।

आप कह रहे हैं "IFoo के लिए बाध्यकारी उसी ऑब्जेक्ट को हल करेगी, जिसे वापस किया गया था .गेट को बुलाया गया था।" और "IBR के लिए बाध्य करना एक ही ऑब्जेक्ट को हल करेगा जो कि जब वापस किया गया था।"

आप बाइंडिंग को एक साथ श्रृंखलाबद्ध कर सकते हैं, लेकिन आपको IInitializable को हटाने की आवश्यकता होगी उदाहरण के सक्रिय होने पर डुप्लिकेट आरंभीकरण का कारण होगा:

  kernel.Bind & lt; IBoo & gt; ()। & Lt; फ़ू & gt; () में। सिसिंग्टनस्स्कोप (); .OnActivation (उदाहरण = & gt; instance.Initialize ()); कर्नेल.बाइंड & lt; आईबीज़ & gt; () .ओओमथ (सीटीएक्स = & gt; (आईआईएएज़) सीटीएक्स। कर्नेल। जाओ & lt; IBoo & gt; ());  

या

  कर्नेल.बंड & lt; फ़ू & gt; ()। ToSelf ()। InSingletonScope () .ऑक्टिवेशन (उदाहरण = & gt; उदाहरण। Initialize () ); कर्नल.बंड & lt; आईबीज़ & gt; ()। ToMethod (ctx = & gt; ctx.Kernel.Get & lt; फ़ू & gt; ()); कर्नेल.बंड & lt; IBoo & gt; ()। ToMethod (ctx = & gt; ctx.Kernel.Get & lt; फ़ू & gt; ());  

एक ही सिंगलटन उदाहरण को हल करने के लिए कई इंटरफेस प्राप्त करने के लिए। जब मैं इस तरह की परिस्थितियों को देखता हूं, तो मुझे हमेशा पूछना पड़ता है, क्या आपकी ऑब्जेक्ट बहुत ज्यादा कर रही है अगर आपके पास दो जिम्मेदारियों के साथ सिंगलटन है?


Comments

Popular posts from this blog

windows - Heroku throws SQLITE3 Read only exception -

lex - Building a lexical Analyzer in Java -

python - rename keys in a dictionary -