2011-11-22 12 views
5

के साथ मैं निनजेक्ट (और सामान्य रूप से डीआई) के लिए नया हूं।पोस्ट-प्रारंभिक ऑब्जेक्ट सृजन ninject

मुझे समझ में कैसे गिरी लोड मॉड्यूल, और कोड मैं अब तक लिखा है एक ही पंक्ति हो जाता है:

myKernel.Get<MyApp>() 

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

अब मैं एक बिंदु पर पहुंच गया हूं कि मुझे प्रारंभिकता के बाद ऑब्जेक्ट सृजन के बारे में सोचने की ज़रूरत है और मेरा कारखाना पैटर्न अब इसे काट नहीं रहा है। यह (दूरस्थ) ग्राहकों के लिए एक पब/उप इंटरफ़ेस का समर्थन करना होगा। मेरे सर्वर से हर नए कनेक्शन के साथ, मैं एक निंजा मॉड्यूल में परिभाषित बाइंडिंग के सेट के अनुसार नया IClient उदाहरण बनाना चाहता हूं। क्या इसका मतलब यह है कि मैं जिस कारखाने को प्रारंभ में पास करता हूं, उसका अपना कर्नेल (या मुख्य कर्नेल को रेफरी) होना चाहिए? इस में CommonServiceLocator कहां होगा। सीएसएल आवश्यक है?

इससे पहले कि मैं बहुत दूर मृत अंत तक यात्रा करता हूं, मैंने सोचा कि यह पूछना सबसे अच्छा होगा कि अन्य इस समस्या से कैसे संपर्क कर सकते हैं।

उत्तर

5

एक कारखाने इंटरफ़ेस बनाएँ

public interface IClientFactory 
{ 
    IClient CreateClient(); 
} 

निनजेक 2.3 के लिए https://github.com/ninject/ninject.extensions.factory देखें और इसे निनजेक्ट द्वारा लागू करके इसे लागू करने दें निम्नलिखित विन्यास।

Bind<IClientFactory>().ToFactory(); 

2.2 के लिए कार्यान्वयन स्वयं करें। यह कार्यान्वयन कंटेनर कॉन्फ़िगरेशन का हिस्सा है और आपके कार्यान्वयन का हिस्सा नहीं है।

public class ClientFactory: IClientFactory 
{ 
    private IKernel kernel; 
    public ClientFactory(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    public IClient CreateClient() 
    { 
     return this.kernel.Get<IClient>(); 
    } 
} 
+0

धन्यवाद रेमो। तो अगर मैं सही ढंग से समझता हूं, तो 2.3 में आपको फैक्ट्री इंटरफेस के ठोस कार्यान्वयन के बारे में चिंता करने की आवश्यकता नहीं है? 'ToFactory() 'कॉल का उपयोग करके बाध्य होने पर वास्तविक कार्यान्वयन किसी भी तरह से निकल जाता है? – spender

+0

हां इसे गतिशील प्रॉक्सी –

+0

नाइस का उपयोग करके स्वचालित रूप से कार्यान्वित किया गया। आपकी सहायता के लिए धन्यवाद. यह मेरे सिर में बहुत सारे प्रश्न साफ़ करता है। – spender

1

यह कारखाने के लिए निम्नलिखित पैटर्न की तरह दिखता है मेरी जरूरतों को संतुष्ट कर सकता है:

Bind<Func<IClient>>().ToMethod(ctx =>() => ctx.Kernel.Get<ClientImpl>()); 

जहाँ मैं फार्म के निर्माता है:

SomeCtor(Func<IClient> clientFactory, blah...) 
संबंधित मुद्दे