2014-06-23 6 views
9

पर विचार को लागू करने के सभी पंजीकृत वस्तुओं की एक सूची प्राप्त करें।एक निश्चित इंटरफ़ेस

अब मैं ISomeInterface को लागू करने वाली सभी पंजीकृत वस्तुओं में से IEnumerable प्राप्त करना चाहता हूं।

मैं इसे ऑटोफैक में कैसे पूरा कर सकता हूं?

+0

Autofac नहीं करता है: बजाय

var types = con.ComponentRegistry.Registrations.Where(r => typeof(ISomeInterface).IsAssignableFrom(r.Activator.LimitType)).Select(r => r.Activator.LimitType); 

फिर हल करने उत्प्रेरक का उपयोग कर

की गणना प्रकार वास्तव में आप जो भी पूछ रहे हैं उसका समर्थन करने में सहायता करते हैं। यदि आप पंजीकरण नहीं बदल सकते हैं, तो आप को हो सकता है। रजिस्ट्रेशन के संग्रह के खिलाफ किसी भी प्रश्न को करने से जरूरी नहीं है कि डायनामिक पंजीकरण स्रोत (जिनमें से कुछ कंटेनर में स्वचालित रूप से पंजीकृत हों - 'IENumerable 'जैसी चीजों का समर्थन करने के लिए)। आप जो क्वेरी से बाहर निकलते हैं वह पूरी सूची नहीं हो सकता है। –

उत्तर

12

बस इस की कोशिश की, काम करता है और जीवन भर के संदर्भ पर निर्भर नहीं करता:

IEnumerable<ISomeInterface> lst = types.Select(t => con.Resolve(t) as ISomeInterface); 
+0

अच्छा। मेरे कार्यान्वयन से क्लीनर। – kasperhj

19

आप

container.Register(c => new A()).As<ISomeInterface>(); 
container.Register(c => new B()).As<ISomeInterface>(); 

है, तो फिर जब आप कर

var classes = container.Resolve<IEnumerable<ISomeInterface>>(); 

आप एक चर कि ISomeInterface की एक सूची है, ए और बी युक्त

+0

यह काम नहीं करता है। घटक 'ISomeInterface' के रूप में पंजीकृत नहीं हैं, लेकिन उन्हें कम से कम लागू नहीं करते हैं। – kasperhj

+0

क्या आप नहीं कर सकते: कंटेनर। रजिस्ट्रार (सी => नया SomeClassA())। () के रूप में? –

+0

दुर्भाग्य से नहीं, नहीं। वास्तविक पंजीकरण मेरे नियंत्रण में नहीं है। – kasperhj

2

यहाँ है मैं कैसे किया मिलेगा यह।

var l = Container.ComponentRegistry.Registrations 
      .SelectMany(x => x.Services) 
      .OfType<IServiceWithType>() 
      .Where(x => 
       x.ServiceType.GetInterface(typeof(ISomeInterface).Name) != null) 
      .Select(c => (ISomeInterface) c.ServiceType); 
+0

यह मेरे लिए काम नहीं करता है - 'System.InvalidCastException: 'के साथ' चयन 'खंड में विफल रहता है' MyCompany.Communications 'टाइप करने के लिए' System.RuntimeType 'प्रकार का ऑब्जेक्ट डालने में असमर्थ। Core.ICommunicationService '।' '। – Tagc

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