2011-01-23 3 views
6

में कंटेनर प्रकार प्राप्त करना संभव है उदाहरण के लिए, मैंने System.Type प्रकार के निर्माता में एक पैरामीटर के साथ क्लास सी 1 पंजीकृत किया है। मेरे पास टाइप 1 के इंजेक्शन पैरामीटर के साथ एक और कक्षा (सी 2) है। और मैं स्वचालित रूप से सी 1 कन्स्ट्रक्टर में typeof(C2) प्राप्त करना चाहता हूं। क्या यह किसी भी तरह से संभव है?क्या ऑटोफ़ैक

उदाहरण कोड:

public class C1 
{ 
    public C1(Type type) {} 

    // ... 
} 

public class C2 
{ 
    public C2(C1 c1) {} 

    // ... 
} 

// Registration 
containerBuilder.Register(???); 
containerBuilder.Register<C2>(); 

उत्तर

7

यह करना चाहिए:

builder.RegisterType<C1>(); 
builder.RegisterType<C2>(); 
builder.RegisterModule(new ExposeRequestorTypeModule()); 

कहाँ:

class ExposeRequestorTypeModule : Autofac.Module 
{ 
    Parameter _exposeRequestorTypeParameter = new ResolvedParameter(
     (pi, c) => c.IsRegistered(pi.ParameterType), 
     (pi, c) => c.Resolve(
      pi.ParameterType, 
      TypedParameter.From(pi.Member.DeclaringType))); 

    protected override void AttachToComponentRegistration(
      IComponentRegistry registry, 
      IComponentRegistration registration) 
    { 
     registration.Preparing += (s, e) => { 
      e.Parameters = new[] { _exposeRequestorTypeParameter } 
       .Concat(e.Parameters); 
     }; 
    } 
} 

किसी भी घटक है कि एक System.Type पैरामीटर लेता अनुरोधकर्ता पारित कर के प्रकार के मिल जाएगा इसके लिए (यदि कोई हो।) एक संभावित सुधार NamedParameter का उपयोग करने के लिए हो सकता है से Type पैरामीटर को प्रतिबंधित करने के लिए जो केवल कुछ निश्चित नाम वाले लोगों से मेल खाए जाएंगे।

अगर यह काम करता है तो कृपया मुझे बताएं, अन्य ने एक ही सामान्य कार्य के बारे में पूछा है और यह उनके साथ साझा करना अच्छा होगा।

+0

नहीं, दुर्भाग्यवश, यह काम नहीं करता है। LimitType घटक का प्रकार है (इस मामले में सी 1) – oryol

+0

आह - दोह! - उसके लिए धन्यवाद। मुझे विकल्पों के बारे में एक विचार होगा और अगर मुझे कोई मिल जाए तो उन्हें यहां पोस्ट करें। –

+0

मुख्य समस्या AutowiringParameter में है। यह हमेशा पैरामीटर के बिना बच्चों के लिए संकल्प का आह्वान करता है (खाली संख्यात्मक के साथ)। मैंने समान पैरामीटर बनाया और इसे पंजीकरण में पंजीकृत किया। एक्टिवेटरडेटा। कॉन्फ़िगर किया गया पैरामीटर (जहां एक्टिवेटरडाटा प्रतिबिंब एक्टिवेटरडेटा है) मूल्य: पंजीकरण। एक्टिवेटरडेटा। कार्यान्वयन टाइप। लेकिन यह केवल स्पष्ट सी के लिए काम करता है। (और सी 1 के इंजेक्शन के साथ मुझे सी 1 के लिए 'कन्स्ट्रक्टर नहीं मिला ...' मिला है। – oryol

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