2009-09-10 16 views
50

को देखते हुए की निम्नलिखित पंजीकरणAutofac: सभी उदाहरणों एक प्रकार

builder.Register<A>().As<I>(); 
builder.Register<B>().As<I>(); 
builder.Register<C>().As<I>(); 

var container = builder.Build(); 

मुझे लगता है मैं एक IEnumerable (सरणी या संग्रह यह कोई बात नहीं) के रूप में प्रकार के सभी उदाहरणों को हल करने देख रहा हूँ का समाधान करें।

विंडसर में मैंने निम्नलिखित लिखा होगा।

foreach(I i in container.ResolveAll<I>()) 
{ 
... 
} 

मैं विंडसर से ऑटोफैक 1.4.4.561 पर माइग्रेट कर रहा हूं लेकिन समकक्ष वाक्यविन्यास नहीं देख सकता।

+0

कोई कारण, जिसे आप साझा करना चाहते हैं, क्यों आप विंडसर से ऑटोफैक तक जा रहे हैं? –

+0

चीज जो मैं वास्तव में ऑटोफैक के साथ पसंद करता हूं वह लैमडा अभिव्यक्तियों के माध्यम से गतिशील घटक निर्माण को व्यक्त करने में सक्षम है।ऑटोवॉयरिंग के विरोध में अभिव्यक्तियों का उपयोग करके कंटेनर एक प्रकार का समाधान करते समय "कर रहा है" की गलतफहमी के लिए कम जगह है (नोट: ऑटोफैक अगर आप चाहें तो ऑटोवॉयरिंग का समर्थन करता है)। अंत में विंडसर एपीआई इतनी बड़ी हो गई है कि हर संभावना को पूरा करने के लिए यह जटिलता की छाप देता है, जब आईओसी एक अवधारणा के रूप में वास्तव में काफी सरल है। यह नहीं कह रहा कि मैं कभी भी अन्य विकल्पों को आजमाने के लिए विंडसर का फिर से उपयोग नहीं करूंगा। – crowleym

+1

मैंने विंडसर से ऑटोफैक में जाने पर विचार किया है। विंडसर का एपीआई उलझन में है। – Amy

उत्तर

69

Autofac की वर्तमान versons के लिए: (2.0+, इसलिए कुछ भी आप का उपयोग करना चाहिए आज)

आप एक से अधिक ILoggers (उदाहरण के लिए) रजिस्टर:

var builder = new ContainerBuilder(); 

builder.Register<ConsoleLogger>() 
    .As<ILogger>(); 

builder.Register<EmailLogger>() 
    .As<ILogger>() 
    .PreserveExistingDefaults(); //keeps console logger as the default 

तब मिलता है सब ILogger रों:

var loggers = container.Resolve<IEnumerable<ILogger>>(); 

तुम बस एकके लिए पूछना, कुछ भी विशेष करने की जरूरत नहीं है वांछित प्रकार के 0। Autofac में अन्य adapters के साथ बॉक्स के बाहर संग्रह समर्थन है जो आपके घटकों को अतिरिक्त कार्यक्षमता के साथ लपेट सकता है। ।

इससे इस बीमारी के 2.x ImplicitCollectionSupportModule के रूप में ही उपयोग है, लेकिन सही में पकाया

पुराने संस्करणों के लिए (0.X - 1,4)

दो तरीके:

1) का प्रयोग संग्रह पंजीकरण

var builder = new ContainerBuilder(); 
builder.RegisterCollection<ILogger>() 
    .As<IEnumerable<ILogger>>(); 

builder.Register<ConsoleLogger>() 
    .As<ILogger>() 
    .MemberOf<IEnumerable<ILogger>>(); 

builder.Register<EmailLogger>() 
    .As<ILogger>() 
    .MemberOf<IEnumerable<ILogger>>(); 

तब:

var loggers = container.Resolve<IEnumerable<ILogger>>(); 

जो आपको एक IENumerable देता है।

या 2) आप जो Autofac के नए संस्करण की तरह कोड काम कर देगा ImplicitCollectionSupport मॉड्यूल, का उपयोग कर सकते हैं:

builder.RegisterModule(new ImplicitCollectionSupportModule()); 
builder.Register(component1).As<ILogger>; 
builder.Register(component2).As<ILogger>; 

फिर बल्कि सभी को हल करने के लिए देख रहा से ILogger का एक संग्रह को हल।

var loggers = container.Resolve<IEnumerable<ILogger>>(); 

जो आपको एक आईनेमरेबल देता है, फिर से।

+0

बिल्कुल सही। विकल्प के लिए गया क्योंकि यह अधिक कुशल लगता है क्योंकि कंटेनर संग्रह में क्या रखना है "जानता है"। दूसरा विकल्प पुनरावृत्त करता है हालांकि कंटेनर पदानुक्रम में प्रत्येक पंजीकरण मिलान प्रकारों की तलाश में है। – crowleym

+0

@ फिलिप-रिक हाय, इसका मतलब क्या है autofac में कंटेनर .resolve? यदि आप ऑटोफैक का उपयोग नहीं करते हैं, तो आप किस तरह से Ilogger इंटरफ़ेस घोषित कर सकते हैं? धन्यवाद ... –

+1

@sebastian_h अगर आप ऑटोफैक का उपयोग नहीं कर रहे हैं, तो इस उत्तर का आपके लिए कोई अर्थ नहीं होगा। आप इसके बजाय यहां देखना चाह सकते हैं: http://stackoverflow.com/questions/5646820/logger-wrapper-best-practice –

54

नए (2.x) संस्करण के लिए एक अद्यतन। तुम सब अब जरूरत है:

container.Resolve<IEnumerable<I>>(); 

वहाँ नहीं रह गया है RegisterCollection() या ImplicitCollectionSupportModule के लिए एक की जरूरत है - इस कार्यक्षमता बॉक्स से बाहर आता है।

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