2012-03-07 13 views
5

निम्नलिखित इंटरफेस को देखते हुए के सभी पंजीकृत क्रियान्वयन युक्त एक Enumerable इंजेक्शन:एक अंतरफलक

public interface IMyProcessor 
{ 
    void Process(); 
} 

मैं कई कार्यान्वयन रजिस्टर और मेरी डि कंटेनर की तरह एक वर्ग में उनमें से एक गणनीय इंजेक्षन करने में सक्षम होना चाहते हैं यह:

public class MyProcessorLibrary 
{ 
    private readonly IMyProcessor[] _processors; 

    public MyProcessingThing(IMyProcessor[] processors) 
    { 
     this._processors = processors; 
    } 

    public void ProcessAll() 
    { 
     foreach (var processor in this._processors) 
     { 
      processor.Process(); 
     } 
    } 
} 

क्या यह संभव है? MyProcessorLibrary का मेरा वर्तमान कार्यान्वयन स्थिर रूप से सभी IMyProcessor कार्यान्वयन को देखता है, लेकिन अगर मैं कर सकता हूं तो मैं इसे कंटेनर के माध्यम से करूँगा। मैं एकता का उपयोग कर रहा हूं, लेकिन अगर अन्य कंटेनर इसका समर्थन करते हैं तो उत्सुक हूं।

संपादित करें:

जवाब अब तक के लिए धन्यवाद; स्पष्ट होने के लिए मैं MyProcessorLibrary को किसी अन्य वर्ग में इंजेक्ट करना चाहता हूं, और इसे आश्रित वस्तुओं के पेड़ के तारों के तार के रूप में बनाया गया है, उदाहरण के लिए

public class MyProcessorRepository 
{ 
    public MyProcessorRepository(MyProcessorLibrary processorLibrary) 
    { 
    } 
} 

public class MyProcessorService 
{ 
    public MyProcessorService(MyProcessorRepository processorRepository) 
    { 
    } 
} 

var container = new UnityContainer(); 
// Register a bunch of IMyProcessors... 

var service = container.Resolve<MyProcessorService>(); 
+1

संभव डुप्लिकेट: // stackoverflow.com/questions/1961549/resolving-ienumerablet-with-unity) –

उत्तर

1

मैं के रूप में मैं उसका उपयोग नहीं करते एकता के लिए नहीं बोल सकता, लेकिन यह (Multi Injection देखें) जो मैं प्रयोग करते हैं Ninject के साथ संभव निश्चित रूप से है।

+0

बहुत बढ़िया, यह वास्तव में वही है जो मैं करना चाहता हूं ... यदि एकता के लिए कुछ भी नहीं बदलता है तो मैं थोड़ा सा जवाब स्वीकार करूंगा। धन्यवाद! :) –

4

हां, ऐसा करना संभव है। आपको बस इंटरफ़ेस के साथ पंजीकरण करने वाले प्रकारों के लिए स्ट्रिंग नाम देना है। एक स्ट्रिंग नाम के बिना Register अभी भी एक नाम assignes (मुझे याद है जहाँ तक यह है "डिफ़ॉल्ट") आंतरिक रूप से, यह हल हो गई है जब आप Resolve<T>, लेकिन यह हल नहीं होती है जब आप ResolveAll<T> फोन पर कॉल करें। तो आपको अपने सभी प्रोसेसर को कुछ नाम देने की आवश्यकता हो सकती है।

msdn से एक नमूना (अनुकूलित):

// Create container and register types using a name for each one 
IUnityContainer myContainer = new UnityContainer(); 
myContainer.RegisterType<IMyProcessor, MyProcessorA>(); //default 
myContainer.RegisterType<IMyProcessor, MyProcessorB>("MyProcessorB"); 
myContainer.RegisterType<IMyProcessor, MyProcessorC>("MyProcessorC"); 

// Retrieve a list of non-default types registered for IMyProcessor 
// List will only contain the types MyProcessorB and MyProcessorC 
IEnumerable<IMyProcessor> serviceList = myContainer.ResolveAll<IMyProcessor>(); 

//usage 
var library = new MyProcessorLibrary(serviceList); 
library.ProcessAll(); 
+0

इसके लिए बहुत बहुत धन्यवाद - मुझे नहीं लगता कि मैं अपने प्रश्न में काफी स्पष्ट था। मैंने इसे अपडेट किया है। –

1

यह माइक्रोसॉफ्ट एकता 2.0 प्रलेखन से है। आपके द्वारा उपयोग किए जाने वाले संस्करण को देखें। अन्य आईओसी के लिए निश्चित नहीं है।

// Create container and register types using a name for each one 
IUnityContainer myContainer = new UnityContainer(); 
myContainer.RegisterType<IMyProcessor, MyProcessor1>(); 
myContainer.RegisterType<IMyProcessor, MyProcessor2>("number2"); 

// Retrieve a list of non-default types registered for IMyService 
IEnumerable<IMyProcessor> processors = myContainer.ResolveAll<IMyService>(); 

संपादित करें:

// update MyProcessorLibrary with this property 
[Dependency] 
public IEnumerable<IMyProcessor> MyProcessingThing 
{ 
get { return _processors; } 
set { _processors = value; } 
} 

//then inject the library class like this 
var lib = myContainer.Resolve<MyProcessorLibrary>(); 
myProcessorRepository(lib) 
+0

इसके लिए बहुत बहुत धन्यवाद - मुझे नहीं लगता कि मैं अपने प्रश्न में काफी स्पष्ट था। मैंने इसे अपडेट किया है। –

0

यह एमईएफ के साथ पूरी तरह से समर्थित है।

आप सभी वर्गों है कि इस इंटरफ़ेस को लागू निर्यात करने के लिए होगा, तो का उपयोग [ImportMany]

उदाहरण:

public interface IMyProcessor { void Process(); } 

[Export(typeof(IMyProcessor)] 
public class FirstProc : IMyProcessor { ... } 

[Export(typeof(IMyProcessor)] 
public class SecondProc : IMyProcessor { ... } 

[Export] 
public class MyTest() 
{ 
    [ImportMany] 
    public IMyProcessor[] MyProcessors { get; set; } 
} 
[एकता के साथ हल IEnumerable ] (http के
संबंधित मुद्दे