2010-12-16 11 views
6

मैं एक WinForms अनुप्रयोग के साथ Ninject बाहर कोशिश कर रहा हूँ (मूल रूप से एक स्केच, मैं इसे उपयोग कर रहा हूँ प्रकार का काटा तरह, लेकिन इतना कठोर या विशिष्ट कुछ भी नहीं) .net 4.Winforms के लिए निदान - क्या मेरी वास्तुकला यह बेकार है?

में मुख्य रूप बनाने के लिए, मैं कुछ ऐसा कर रहा हूं:

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     [...] 
     IKernel kernel = BuildKernel(); 
     Application.Run(kernel.Get<frmMain>()); 
    } 

    static IKernel BuildKernel() 
    { 
     var modules = new INinjectModule[] 
     { 
      [..modules] 
     }; 

     return new StandardKernel(modules); 
    } 
} 

ठीक है। यह एक मुख्य रूप बनाता है और इंजेक्शन कन्स्ट्रक्टर को उपयुक्त इंटरफ़ेस कार्यान्वयन को पारित करके, इसे अच्छी तरह से प्रदर्शित करता है।

अब क्या? मेरा आवेदन एक एमडीआई है और एप्लिकेशन मॉडल में हेरफेर करने के लिए कई बाल खिड़कियां होंगी। मेरे पास कर्नेल का कोई संदर्भ नहीं है, तो मुझे इन फॉर्मों को Get() कैसे माना जा सकता है? स्पष्ट जवाब है 'कर्नेल को फॉर्म में पास करें' मुझे लगता है, लेकिन यह एक बहुत ही गन्दा रणनीति है और मुझे यकीन है कि डीआई के दर्शन में फिट नहीं है।

मैं यहां बताउंगा कि निनजेक्ट 2 के लिए प्रलेखन बेकार है। सबकुछ जो मैं पा सकता हूं वह मूल उदाहरण दोहराता है, वास्तव में यह बताते हुए कि निनजेक्ट का उपयोग करने से डीआई कुछ आसान बनाता है। दिए गए उदाहरण का मानक कोडिंग की समस्या बनाने और मॉड्यूल और बाइंडिंग को सार्थक बनाने के लिए पर्याप्त जटिल नहीं है।

# 1 संपादित करें:

लिंक कृपया सैम धारक द्वारा प्रदान की अध्ययन करने के बाद, मैं 'रचना जड़' दृष्टिकोण बाहर कोशिश कर रहा हूँ। मेरे वास्तुकला अब निर्माता अर्थ विज्ञान इस प्रकार के साथ सभी रूपों एक CompositedForm से यह प्राप्त करने के लिए उपयोग करता बलों:

[Inject] 
    public CompositingForm(ICompositionRoot CompositionRoot) 
    { 
     InitializeComponent(); 
     this.CompositionRoot = CompositionRoot; 
    } 
    public readonly ICompositionRoot CompositionRoot; 

    public CompositingForm() : this(new DummyCompositionRoot()) { } 

दूसरे निर्माता फार्म डिजाइनर के लाभ है, जो मूर्ख है और फार्म मार्कअप जब तक नहीं समझ सकता है के लिए आप एक खाली कन्स्ट्रक्टर प्रदान करते हैं। अब, IKernel.Get<AForm>() का उपयोग करके बनाए गए हर फॉर्म में एक रचना रूट जड़ होगी (चाहिए)।

इसलिए, जैसा कि मैं धीमी शिक्षार्थी हूं - अब प्रश्न वास्तव में 'इस रचना रूट में क्या जाना चाहिए'?

उत्तर

1

धन्यवाद João Almeida और Kellabyte को मैं एक विधि है कि कम या ज्यादा संतोषजनक है पाया है:

  • जो जो भी व्यापार के नियम आप ध्यान को उजागर करता है जो एक कस्टम विशेषता को परिभाषित करें;
  • IInjectionHeuristic के कार्यान्वयन को परिभाषित करें जो इस विशेषता को पहचानता है;
  • निनजेक्ट कर्नेल में मॉड्यूल लोड करने के लिए ViewModelLocator का उपयोग करें।
5

क्या आप फॉर्म कन्स्ट्रक्टर को बाल रूप बनाने के लिए कारखाने को पार नहीं कर सकते हैं, और फॉर्म उन्हें प्राप्त करने के लिए इसका उपयोग करता है, फिर जब प्रपत्र का उपयोग करके फॉर्म बनाया जाता है तो कारखाना निर्भरता को तारित कर देगा?

मुझे लगता है कि आपको डीआई कंटेनर का उपयोग करके एप्लिकेशन रूट में सबकुछ कॉन्फ़िगर करना चाहिए और इसके बाद कंटेनर की आवश्यकता नहीं होनी चाहिए, लेकिन मैंने वास्तव में क्रोध में डी कंटेनर का उपयोग नहीं किया है, और एन इंजेक्ट बिल्कुल नहीं, इसलिए मैं जा रहा हूं मैं क्या पढ़ा है पर ...

This answer मदद मिल सकती है

+0

धन्यवाद, मैं अब उस पोस्ट से कुछ लिंक-क्रॉइंग कर रहा हूं। शायद मैं पूरे व्यवसाय को थोड़ा बेहतर कर दूंगा। –

2

नोट: मैं Ninject के बारे में ज्यादा पता नहीं है, लेकिन मैं Spring.net के साथ काम किया और अधिक जटिल है। पीछे के सिद्धांत कुछ समान होना चाहिए।

सैम होल्डर उत्तर उत्कृष्ट है यदि आपके पास बनाने के लिए एक (इंजेक्शन) प्रकार की कई वस्तुएं हैं (उदाहरण के लिए ग्राहक ऑर्डर इटैम)।

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

वैकल्पिक रूप से आप उस फॉर्म में एक विधि जोड़ सकते हैं जो आपको एमडीआई (विधि इंजेक्शन) में एक पृष्ठ जोड़ता है।

static void Main() 
{ 
    [...] 
    IKernel kernel = BuildKernel(); 
    var main = kernel.Get<frmMain>(); 
    main.AddClientForm(kernel.Get<CustomerForm>()) ; 
    main.AddClientForm(kernel.Get<InvoiceForm>()) ; 
    Application.Run(main); 
} 
+0

इनपुट के लिए धन्यवाद। एक सवाल: अगर मैं frmMain पर कन्स्ट्रक्टर इंजेक्शन का उपयोग करना चाहता हूं, तो [इंजेक्ट] के साथ कन्स्ट्रक्टर को सजाने के लिए कैसे संभव है यदि मैं केवल 'क्लास प्रोग्राम' को निनजेक्ट पर निर्भरता प्राप्त करना चाहता हूं? –

+0

मुझे लगता है कि आपके पास frmMain के लिए एक कन्स्ट्रक्टर है जो चाइल्डविंडोज़ की एक श्रृंखला लेता है। BuildKernel() में आपके पास नियम है कि इस सरणी को कैसे बनाया जाए और शेष को NInject करना चाहिए। कृपया क्षमा करें कि मेरे पास एक ठोस उदाहरण नहीं है क्योंकि मैंने अभी तक इंजेक्ट का उपयोग नहीं किया है। – k3b

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