2009-11-20 28 views
5

Autofac के लिए प्रलेखन में एक दिलचस्प पृष्ठ है जो स्वचालित रूप से delegate factories उत्पन्न करने की क्षमता का वर्णन करता है। यह दृढ़ता से सुझाव देता है कि आप हाथ से लिखकर ऑटोफैक के बिना समान परिणाम प्राप्त कर सकते हैं।मैं एक प्रतिनिधि कारखाने को कैसे कार्यान्वित करूं?

मैं आईओसी के लिए एकता का उपयोग कर रहा है और वस्तुओं अन्य वस्तुओं बनाने की जरूरत है कि करने के लिए चारों ओर कंटेनर गुजर से बचने के लिए चाहते हैं, तो आप Autofac के बिना एक प्रतिनिधि कारखाने कैसे लिखना चाहते हैं?

उत्तर

6

ठीक है मैंने अब तक एकता का उपयोग नहीं किया है, इसलिए मेरा जवाब काफी अस्पष्ट है।

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

सबसे पहले आप अपने कारखाने में प्रतिनिधियों को परिभाषित। इस तरह

/// <summary> 
/// Represents a <see cref="Provider{TArg,TServiceType}"/> which holds 
/// the container context and resolves the service on the <see cref="Create"/>-call 
/// </summary> 
internal class GenericFactory{ 
    private readonly IContainer container; 

    public ClosureActivator(IContainer container) 
    { 
     this.container= container; 
    } 

    /// <summary> 
    /// Represents <see cref="Provider{TServiceType}.Invoke"/> 
    /// </summary> 
    public TService Create() 
    { 
     return container.Resolve<TService>(); 
    } 
    /// <summary> 
    /// Represents <see cref="Provider{TArg,TServiceType}.Invoke"/> 
    /// </summary> 
    public TService Create(TArg arg) 
    {   
     return container.Resolve<TService>(new[] {new TypedParameter(typeof (TArg),arg)}); 
    } 
} 

अब क्या आप प्रतिनिधि रजिस्टर, कुछ:

public delegate TServiceType Provider<TServiceType>(); 
public delegate TServiceType Provider<TArg,TServiceType>(TArg argument); 

, जिसे आप एक सामान्य कारखाना बनाने

var newServiceCreater = new GenericFactory(container); 
container.Register<Provider<MyCompoent>>().To(newServiceCreater.Create); 

var newServiceCreater = new GenericFactory(container); 
container 
    .Register<Provider<OtherServiceWithOneArgumentToConstruct>>() 
    .To(newServiceCreater.Create); 

अब अन्य आप अन्य घटकों सिर्फ 'प्रदाता को इंजेक्षन कंटेनर के बजाय '।

+0

मुझे यह शुरू हुआ - बहुत धन्यवाद! – GraemeF

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