2009-07-20 9 views
12

का उपयोग करके डब्ल्यूपीएफ में निर्भरता इंजेक्शन देना मेरे पास एक WPF UserControl है जिसे मैं निर्भरता इंजेक्ट करना चाहता हूं। Ninject के साथ ऐसा करने का सबसे अच्छा तरीका क्या है?निनजेक्ट

एक ठोस उदाहरण लेने के लिए: मेरे पास MapView नामक UserControl है, और मैं कन्स्ट्रक्टर या प्रॉपर्टी इंजेक्शन के माध्यम से इसमें अपने IDialogueService का एक उदाहरण इंजेक्ट करना चाहता हूं। वर्तमान में, मैं किसी भी निर्भरता इंजेक्शन का उपयोग कर रहा है, और मेरे नियंत्रण XAML में बन जाता है:

<Window x:Class="GameWindow" ...> 
    <Grid Name="root"> 
     <MapView x:Name="mapView" ... /> 
     <!-- other stuff here --> 
    </Grid> 
</Window> 

एक IKernel बनाना, और IDialogueService बंधन, काफी सरल है। लेकिन मैं अपने MapView में निर्भरताओं को इंजेक्ट करने के लिए कर्नेल का उपयोग कैसे करें पर अटक गया हूं। मैं अभी भी निनजेक्ट में कुल नौसिखिया हूं, इसलिए शायद कुछ स्पष्ट है कि मुझे याद आ रही है।

मैं इस को हल करने के कई तरीके के बारे में सोच सकते हैं:

  1. कोड में MapView इन्स्तांत। XAML से निकालें <MapView ... />, और बदले GameWindow के निर्माता से जोड़ें:

    public GameWindow(IKernel kernel) { 
        root.Children.Add(kernel.Get<MapView>()); 
    } 
    

    Downsides: XAML का उपयोग नहीं कर से अतिरिक्त जटिलता; GameWindow IKernel पर निर्भरता है।

  2. XAML में इन्स्टेन्शियशन रखें, और बजाय संपत्ति इंजेक्शन का उपयोग करें:

    public GameWindow(IKernel kernel) { 
        kernel.Inject(mapView); 
    } 
    

    गिरावट: Ninject डॉक्स का कहना है कि इंजेक्ट() "ज्यादातर मामलों के लिए नहीं किया जाना चाहिए", तो मैं भी नहीं जानता कि अगर ऐसा होता है जो मुझे लगता है कि यह करता है, या यह यहां इसका उपयोग करने के लिए समझ में आता है। और GameWindow अभी भी IKernel पर निर्भरता है।

  3. गेमविंडो में इंजेक्शन योग्य पैरामीटर/गुण जोड़ें जो मैप व्यू के साथ मूल्यों को पास करता है (शायद मैप व्यू पर गुणों के माध्यम से), और फिर Get<GameWindow>() का उपयोग करें। डाउनसाइड: अब मैं मैन्युअल रूप से पूरे स्थान पर निर्भरता पारित कर रहा हूं, जो कि डीआई ढांचे को मेरे लिए स्वचालित करना है।

  4. गेमविंडो को तुरंत चालू करने के बाद, लॉजिकल पेड़ पर जाएं और IKernel.Inject() को सबकुछ पर कॉल करें। डाउनसाइड्स: फिर से, मुझे नहीं पता कि इंजेक्ट() क्या करता है जो मुझे लगता है कि यह करता है, या यह उचित है या नहीं। गेमविंडो को तुरंत चालू करने के बाद कॉलर को चलने-दृश्य-पेड़-और-इंजेक्ट चीज़ करना याद रखना चाहिए।

क्या ऐसा करने का कोई बेहतर तरीका है? शायद निनजेक्ट के लिए एक डब्ल्यूपीएफ एक्सटेंशन जो मुझे Get<GameWindow>() करने देता है, और स्वचालित रूप से मेरे लिए लॉजिकल पेड़ (जैसा कि # 4 में) चलता है, सबकुछ पर संपत्ति इंजेक्शन कर रहा है? अगर ऐसी कोई चीज़ मौजूद नहीं है, तो क्या यह मेरे लिए लिखना संभव होगा?

आप डब्ल्यूपीएफ के साथ निनजेक्ट का उपयोग कैसे करते हैं? क्या आप उपरोक्त में से किसी भी दृष्टिकोण का उपयोग करते हैं (और यदि हां, तो क्या आप ऊपर/डाउनसाइड्स साझा कर सकते हैं जिन्हें मैं नहीं जानता)? क्या आपके पास बेहतर दृष्टिकोण हैं?

उत्तर

4

1) सबसे अच्छा है। आपको यह भी पता चलेगा कि यह मानचित्रदृश्य कार्यों के लिए एक सुविधाजनक प्रवेश बिंदु है।

इसके अलावा, कर्नेल में गुजरने के बजाय, कर्नेल करें। < गेमविंडो>() और [इंजेक्ट] गेमविंडो में मैप व्यू प्राप्त करें।

+0

नियंत्रण इंजेक्शन स्वयं भी मेरे साथ कभी नहीं हुआ, लेकिन अब यह स्पष्ट प्रतीत होता है। धन्यवाद! –

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