2011-08-25 15 views
13

मैं अपने आवेदन में निर्भरता इंजेक्शन को संभालने के लिए ऑटोफैक का उपयोग कर रहा हूं। हालांकि, मेरे पास एक घटक है जो रनटाइम पर कुछ प्रतिबिंब जादू करता है और मुझे संकलन-समय पर पता नहीं है कि इसकी निर्भरताओं की आवश्यकता होगी।एक सेवा लोकेटर के रूप में ऑटोफैक का उपयोग

आमतौर पर, मैं सिर्फ इस घटक संदर्भ कंटेनर सीधे है और हल जो कुछ भी यह चाहता है जाएगा। हालांकि, इस कक्षा को तुरंत चालू करने वाली कक्षा में कंटेनर का कोई संदर्भ नहीं है।

प्रभावी रूप से, मेरे घटक Autofac पर एक निर्भरता है। मैं लूसर युग्मन पसंद करूंगा, लेकिन यह यहां एक विकल्प प्रतीत नहीं होता है। क्या पूछने का कोई तरीका है (कन्स्ट्रक्टर तर्क में, या संपत्ति इंजेक्शन का उपयोग करना, या जो भी हो!) ऑटोफैक मुझे मेरे कन्स्ट्रक्टर में कंटेनर का संदर्भ देने के लिए? या, क्या ऑटोफैक मुझे एक जादू सेवा लोकेटर ऑब्जेक्ट प्रदान करने का एक क्लीनर तरीका है जो कुछ भी हल कर सकता है?

+2

यह देखना दिलचस्प होगा कि घटक "जादू" क्या कर रहा है। शायद सेवा लोकेटर पैटर्न की तुलना में अन्य तरीके हैं। क्या आप कुछ कोड के साथ अपडेट कर सकते हैं? –

+0

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

+0

आपका मतलब है: http://kozmic.pl/2010/03/11/advanced-castle-windsor-ndash-generic-typed-factories-auto-release-and-more/ –

उत्तर

12

हाँ, आप कर सकते हैं। टिप्पणियों से

public class MyComponent 
{ 
    IComponentContext _context; 
    public MyComponent(IComponentContext context) 
    { 
     _context = context; 
    } 

    public void DoStuff() 
    { 
     var service = _context.Resolve(...); 
    } 
} 

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

+0

क्या यह कई जीवनकाल क्षेत्रों के साथ काम करेगा? यानी IComponentContext आधार कंटेनर या दायरा होगा? –

+3

यह उस क्षेत्र से 'IComponentContext' को हल करेगा जिसमें 'MyComponent' का समाधान किया गया था। इसलिए यदि 'MyComponent' को' InstancePerLifetimeScope 'के रूप में पंजीकृत किया गया है, तो' संदर्भ' हमेशा अपेक्षित दायरे से हल हो जाएगा। –

+0

बिल्कुल सही, बस मुझे जो चाहिए था। –

1

आप मान लें कि दो घटकों, ए और बी

एक पता करने के लिए बी के बारे में एक्स उपयोग करने से पहले की जरूरत है, इस मेटाडाटा पूछताछ है और यह इस excellent पोस्ट में वर्णित है।

इसके अलावा, यहां तक ​​कि अगर आप उस पोस्ट करने के लिए अपने डिजाइन अनुकूलन नहीं कर सकते हैं, आप फिर से यकीन है कि अगर तुम सच में एक सेवा लोकेटर के रूप में अपने डि कंटेनर उपयोग करने की आवश्यकता बनाने के लिए प्रयास करना चाहिए।

इस writting के समय, सबसे अच्छा ब्लॉग पोस्ट मैं इसे this एक है का वर्णन मिल सकता है।

+0

मुझे यकीन नहीं है कि आप उन प्रश्नों के साथ पहले से ही उत्तर दिए गए प्रश्न का उत्तर क्यों देंगे जो मेरे प्रश्न से संबंधित नहीं हैं ... जैसा कि मैंने कहा था, मेरी समस्या यह नहीं जानती कि मुझे "बी" को हल करने की आवश्यकता होगी रनटाइम तक। –

+1

@ निकोसबैक्सवेनिस +1, भले ही ओपी इसे प्राप्त न करे। दोनों पद उत्कृष्ट हैं।निकोलस पोस्ट से यह एक वाक्यांश यह सब फिर से शुरू करता है: "साथ ही, आपके घटकों में आईकॉन्टेनर या आईसीओम्पोनेंट कॉन्टेक्स्ट का उपयोग करने के लिए व्यावहारिक रूप से कोई बहाना नहीं है"। – rsenna

0

अन्य मामलों में, जब अपने घटक डि उपयोग करके बनाया जाता है, तो आप अभी भी सेवा लोकेटर पैटर्न का उपयोग कर सकते हैं। CodePlex पर सामान्य सेवा लोकेटर लाइब्रेरी उद्देश्य के लिए बिल्कुल सही है।