2009-07-09 10 views
9

मुझे पता है कि कुछ डी ढांचे इस का समर्थन करते हैं (उदा। Ninject), लेकिन मैं विशेष रूप से जानना चाहता हूं कि Autofac के साथ यह संभव है या नहीं।ऑटोफैक स्वचालित स्व-बाध्यकारी कर सकता है?

मैं एक ठोस वर्ग के लिए ऑटोफैक कंटेनर से पूछने में सक्षम होना चाहता हूं, और उस ठोस वर्ग को पंजीकृत किए बिना सभी उपयुक्त कन्स्ट्रक्टर निर्भरताओं इंजेक्शन के साथ एक उदाहरण वापस प्राप्त करना चाहता हूं। अर्थात, और अगर मैं यह स्पष्ट रूप से बाध्य कभी नहीं, तो स्वचालित रूप से ठोस वर्ग खुद को, बाँध के रूप में अगर मैं builder.Register<MyClass>();

ViewModels बुलाया था जब यह उपयोगी होगा का एक अच्छा उदाहरण है। एमवीवीएम में, लेयरिंग ऐसा है कि केवल व्यू व्यूमोडेल पर निर्भर करता है, और वह ढीली टाइपिंग के माध्यम से, और आप वैसे भी यूनिट-टेस्ट नहीं देखते हैं। तो परीक्षण के लिए ViewModel को नकल करने की कोई आवश्यकता नहीं है - और इसलिए प्रत्येक व्यूमोडेल के लिए इंटरफ़ेस रखने का कोई कारण नहीं है। तो इस मामले में, "इस वर्ग को हल करने के लिए इस इंटरफेस को पंजीकृत करें" का सामान्य डी पैटर्न अनावश्यक जटिलता है। स्पष्टीकरण स्व-बाध्यकारी, जैसे builder.Register<MyClass>();, कंक्रीट वर्ग के रूप में सीधे कुछ के साथ व्यवहार करते समय भी एक अनावश्यक कदम की तरह लगता है।

मैं ऑटोफैक दस्तावेज़ों में reflection-based registration example से अवगत हूं, लेकिन यह मेरे स्वाद के लिए भी नहीं है। मैं समय से पहले हर संभावित वर्ग को पंजीकृत करने की जटिलता (और धीमा) नहीं चाहता; मैं ढांचा चाहता हूं कि जब मुझे इसकी ज़रूरत हो तो मुझे क्या चाहिए। विन्यास पर सम्मेलन, और वह सब।

ऑटोफैक को कॉन्फ़िगर करने का कोई तरीका है तो यह कह सकता है "ओह, यह एक ठोस प्रकार है, और कोई भी इसे पंजीकृत नहीं करता है, इसलिए मैं बस कार्य करता हूं जैसे कि यह डिफ़ॉल्ट सेटिंग्स के साथ पंजीकृत था"?

उत्तर

12
builder.RegisterTypesMatching(type => type.IsClass) 

आप look at the source अगर आपको लगता है कि RegisterTypesMatching (और RegisterTypesFromAssembly) कोई भी परावर्तन नहीं कर रहा है देखेंगे। इस मामले में सभी ऑटोफैक एक नियम पंजीकृत कर रहा है जो एक प्रकार स्वीकार करता है या नहीं। ऊपर दिए गए मेरे उदाहरण में मैं किसी वर्ग को स्वीकार करता हूं जो एक वर्ग है।

RegisterTypesFromAssembly के मामले में, ऑटोफैक एक नियम पंजीकृत करता है जो कहता है, "यदि आप जिस प्रकार को हल करने का प्रयास कर रहे हैं, तो विधानसभा == निर्दिष्ट असेंबली है, तो मैं आपको एक उदाहरण दूंगा"।

तो:

  1. कोई प्रकार प्रतिबिंब रजिस्टर समय
  2. किसी भी प्रकार है कि मापदंड से मेल खाने का समाधान हो जाएगा पर किया जाता है

सीधे ठोस प्रकार रजिस्टर करने के लिए तुलना में, यह होगा ऑटोफैक को उदाहरण के बारे में पता लगाना होगा क्योंकि संकल्प समय पर एक perf हिट है निर्माता आवश्यकताओं। उस ने कहा, यदि आप डिफॉल्ट इंस्टेंस स्कोप के साथ जाते हैं, जो सिंगलटन है, तो आप उस प्रकार को केवल पहली बार हिट करते हैं। अगली बार यह पहले से बनाए गए सिंगलटन इंस्टेंस का उपयोग करेगा।

अद्यतन: ऑटोफैक 2 में कंटेनर को कुछ भी हल करने में सक्षम बनाने का एक बेहतर तरीका है। इसमें the AnyConcreteTypeNotAlreadyRegistered registration source शामिल है।

+0

मीठा - ठीक वैसे ही लगता है जो मैं खोज रहा था। धन्यवाद! –

2

किस बारे में:

builder.RegisterTypesFromAssembly(Assembly.GetExecutingAssembly()); 

कोई प्रतिबिंब पीटर Lillevold points out के रूप में किया जाता है,।

+1

मेरी पिछली टिप्पणियों को हटा दिया गया क्योंकि आप सही थे (जैसा कि आपने अपने संपादन में स्पष्ट किया है): RegisterTypesFromAssembly बड़े पैमाने पर प्रतिबिंब नहीं करता है क्योंकि इसका नाम बताता है। यह रजिस्टरटाइप मैचिंग के आस-पास शॉर्टेंड फ़ंक्शंस के परिवार में से एक है, और वही करता है जो मैं ढूंढ रहा हूं, लेकिन बहुत तेज़ नियंत्रण वाला, जो बहुत प्यारा है। पहली बार आपके उत्तर को गलतफहमी के लिए माफी माँगता हूं। –

+0

आपके द्वारा दिया गया लिंक टूटा हुआ है ... – Guillaume

+1

कृपया मुझे क्षमा करें लेकिन यह उत्तर 3 साल पुराना है: पी इसके अलावा, बहुत से ऑटोफैक के लिए बहुत खुशी हुई है, मुझे नहीं लगता कि इनमें से कोई भी अब प्रासंगिक है .. –

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