2009-05-23 11 views
8

में एक कनवर्टर इंजेक्ट कैसे करें मेरे पास एक IValueConverter लागू कक्षा है और मुझे इसे अपने डी कंटेनर (निनजेक्ट) का उपयोग करके इंजेक्शन देने की आवश्यकता है।एक्सएएमएल

समस्या है, एक्सएएमएल में, कनवर्टर ऑब्जेक्ट के तत्काल पर नियंत्रण पाने के लिए तुरंत कोई स्पष्ट तरीका नहीं है।

तो मेरी XAML इस तरह की एक पंक्ति कुछ में शामिल हैं:

स्रोत = "{बाइंडिंग पथ = CurrentMessage, कनवर्टर = {StaticResource ImagePathConverter}}"

कहाँ, ImagePathConverter होगा मेरे लिए बनाया जाना चाहिए।

मुझे लगता है कि मैं एक "सेवा लोकेटर" स्थैतिक वर्ग बना सकता हूं और अपनी निर्भरता को हल करने के लिए इसे कॉल कर सकता हूं और स्टेटिक रिसोर्स को "MyServiceLocator.ImageConverter" में बदल सकता हूं, लेकिन इससे मुझे उल्टी करना है।

मुझे उम्मीद है कि इस प्रश्न का उत्तर कोड के कुछ स्निपेट के साथ दिया जा सकता है जो विशेष रूप से प्रदान किए गए कोड को लक्षित करते हैं - और शायद एक उदाहरण के लिए एक सहायक लिंक। कहीं नज़र डालने की सिफारिश नहीं है।

इसके अलावा, बहुत महत्वपूर्ण बात यह है कि XAML में कोड-पीछे नहीं है - और मैं एक का उपयोग नहीं कर सकता। मैं त्वचा बना रहा हूं और एक कोड पीछे नहीं चाहता है। तो मैं कक्षा कन्स्ट्रक्टर में कक्षा चर सेट नहीं कर सकता और इसका संदर्भ नहीं दे सकता। शायद यह अनुचित है, मुझे अभी तक यकीन नहीं है।

+0

मुझे पता है कि तुम क्यों कनवर्टर की जरूरत डि साथ हल किया जा करने के लिए इच्छुक हूँ ..? – NotDan

+0

क्योंकि कन्वर्टर एक स्वरूपण वर्ग पर (निर्भर करता है) का उपयोग करता है, जिसकी इसकी निर्भरताएं होती हैं और उनमें से प्रत्येक निर्भरता पर भी निर्भरता हो सकती है। यह मेरे लिए इन सभी निर्भरताओं को तारित करने के लिए डीआई का पूरा बिंदु है। मुझे आश्चर्य है कि क्या कई लोग इसे नए ऑब्जेक्ट्स के लिए उपयोग कर रहे हैं और मुख्य उद्देश्य का एहसास नहीं करते हैं? – PandaWood

उत्तर

8

इसे संभालने का एक आम तरीका आपके कनवर्टर के लिए MarkupExtension भी है। यही कारण है:

public class MyConverter : MarkupExtension, IValueConverter 

आपका ProvideValue() विधि आप इस तरह इसका इस्तेमाल करने की इजाजत दी अपनी कनवर्टर का एक उदाहरण लौट सकते हैं, इस प्रकार:

Source="{Binding CurrentMessage, Converter={local:MyConverter SomeParameterToConverter}}" 

यह वास्तव में डि से कोई लेना देना नहीं है, लेकिन यह कोड को खत्म करने के लिए आपकी आवश्यकता को संबोधित करता है। मैं वास्तव में आपके डी कंटेनर के साथ पंजीकृत कनवर्टर्स होने का बिंदु नहीं देखता हूं।

+1

धन्यवाद, यह कन्वर्टर्स के बारे में एक उचित चिंता है। डी कंटेनर के साथ पंजीकृत कन्वर्टर्स के अंक नहीं देखकर, मुझे लगता है कि आप मानते हैं कि डी कंटेनर का उपयोग केवल 'नई अप' ऑब्जेक्ट्स में किया जा रहा है। बिंदु यह है कि प्रश्न में कनवर्टर क्लास में अन्य निर्भरताएं हैं जिन्हें केवल डी कंटेनर द्वारा हल किया जा सकता है (उदाहरण के लिए सिंगलटन स्कोप में पंजीकृत "कॉन्फ़िगरेशन" ऑब्जेक्ट्स) – PandaWood

+0

मुझे लगता है कि यह एक अच्छा जवाब है, जब मैं त्रुटि को ठीक कर सकता हूं ' मैपिंग निर्देश में अनुपलब्ध XmlNamespace, असेंबली, या ClrNamespace 'मैं वापस आऊंगा (यानी xmlns जोड़ने के बावजूद: स्थानीय = "clr-namespace: MyNamespace" – PandaWood

+1

समझ गया! त्रुटि को ठीक किया गया और यह अच्छी तरह से काम करता है। मुझे अभी भी कॉल करने की आवश्यकता है ProvideValue विधि में एक सेवा लोकेटर फैशन में मेरा डीआई, लेकिन मुझे नहीं लगता कि इसके आसपास कोई रास्ता है) – PandaWood

0

MarkupExtension के माध्यम से निर्भरता को हल करने के लिए वैकल्पिक विकल्प है और इसे एक्सएएमएल में कनवर्टर की संपत्ति में सेट करें।

जानकारी के लिए निम्नलिखित जवाब देखें:

https://stackoverflow.com/a/41611854/2115905

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