2015-05-06 12 views
5

मुझे उम्मीद है कि यह एक बेवकूफ सवाल नहीं है, लेकिन मैं कैलिबर्न का उपयोग कर मॉडल देखने में निर्भरताओं को इंजेक्ट करने के लिए सीधे आगे बढ़ने में असमर्थ हूं। माइक्रो।Caliburn.Micro में मॉडल देखने में निर्भरताओं को इंजेक्ट कैसे करें?

मैं एक मुख्य खोल (कंडक्टर) इसलिए की तरह हो रही है:

public class ShellViewModel : Conductor<IScreen>.Collection.OneActive, IShell 
{ 
    public ShellViewModel(IEventAggregator eventAggregator) { 
     ActivateItem(new DashboardViewModel()); 
    } 
} 

अब मैं DashboardViewModel में एक सेवा इंजेक्षन करना चाहते हैं लेकिन जब से ActivateItem विधि मुझे आवश्यकता है एक उदाहरण (पारित बजाय उदाहरण के लिए एक प्रकार), मुझे सेवा प्रदान करने के लिए मजबूर किया गया है। और चूंकि ShellViewModel अंतर्निहित आईओसी कंटेनर से अवगत नहीं है, इसलिए मुझे खोल में इंजेक्शन देने की सेवा है .. मेरे लिए ऐसा लगता है कि कैलिबर्न एक एप्लिकेशन के भीतर सभी दृश्य मॉडल और निर्भरताओं का एक पूरा ग्राफ लागू करने की कोशिश कर रहा है।

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

+0

क्या आपको निर्भरता इंजेक्शन का लाभ उठाने के लिए एक इंटरफ़ेस का उपयोग करके ActiveateItem का उपयोग करने का कोई तरीका मिला? फिलहाल, एकमात्र तरीका एक व्यूमोडेल उदाहरण पास करना और आईओसी के माध्यम से सेवाएं प्राप्त करना है? – Sascha

उत्तर

0

इसे करने के कुछ तरीके इसे पूरी तरह से कंटेनर की पसंद पर निर्भर करते हैं।

MEF [ImportMany] पैरामीटर पर निर्माता है कि वास्तविक आयात संदर्भ हैलो स्क्रीन उदाहरण

आप IoC.Get<IDashBoard>() या IoC.GetAll<IDashBoard>() इस्तेमाल कर सकते हैं आईओसी स्थिर कक्षा में पकाया क्या करेंगे में प्रयोग किया जाता है, इस मान लिया गया है कि आप अपने प्रकार के रजिस्टर है आपके द्वारा उपयोग किए जाने वाले कंटेनर में। इस के साथ सावधानी बरतें और इसका परिणाम विरोधी पैटर्न व्यवहार में हो सकता है। मैंने इसे अपने ऐप में से एक में किया है जो डैशबोर्ड करता है, जो मेरे कंटेनर इंस्टेंस में आईडीशबोर्ड के साथ टैग किया गया है, वास्तविक कार्यान्वयन वर्ग के सहयोग से IoC.GetAll<IDashboard>() संग्रह में संग्रहित किया जाएगा या संग्रह में पहला आइटम IoC.Get<IDashBoard>() पर आधारित होगा ।

आप सभी आप आइटम प्राप्त अपने डैशबोर्ड आप आइटम संपत्ति के लिए पहुँच (संग्रह का हिस्सा है) की अनुमति देकर Conductor<IDashBoard>.Collection.AllActive वारिस, वहाँ और अपने DashBoardViewMode की ctor से पॉप्युलेट कर सकता है, कि एक ही स्थान पर IoC.GetAll<IDashboard>() का उपयोग कर अपने डैशबोर्ड पर जरूरत है। वहां से, मैं ऑनएक्टिवेट में आइटम संग्रह संपत्ति से पूछता हूं और अन्य व्यूमोडल्स से उन गुणों से मेल खाता हूं जिन्हें मुझे आवश्यक था और डैशबोर्डवर्ड व्यू पर ContentControls नाम दिया गया था।

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

मैं वास्तव में एमईएफ से दूर चले गए क्योंकि सीएम में इस्तेमाल किए गए संस्करण ओपन जेनेरिक के साथ काम नहीं करते हैं और गायब निर्यात() गुणों को डिबग करना मुझे पहनना शुरू कर रहा था।

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