2012-02-02 13 views
5

ऑटोफैक का उपयोग करना, क्या ऐसा करना संभव है? मेरे पास उदाहरण का प्रकार नहीं है।क्या ऑटोफैक से एक उदाहरण को हल करना संभव है, केवल एक स्ट्रिंग कुंजी दी गई है?

var instance = container.Resolve("someStringKey"); 

कुछ गुगलिंग से, ऐसा संभव नहीं लगता है, लेकिन मैं सुनिश्चित करना चाहता था।

धन्यवाद।

उत्तर

8

संक्षिप्त उत्तर यह है: नहीं, आपके पास बॉक्स के बाहर बॉक्स है।

आप प्रकार क्योंकि, तकनीकी रूप से बोल रहा है, तो आप दो अलग-अलग नाम दिया सेवाओं विभिन्न प्रकार के साथ रजिस्टर कर सकते हैं होना चाहिए:

builder.RegisterInstance(someObject).Named<IFoo>("name-here"); 
builder.RegisterInstance(someOtherObject).Named<IBar>("name-here"); 

प्रकार के बिना, आप के क्रमित करेंगे "आप क्या मिलेगा मिलता है," यदि तुम्हें मालूम है कि मेरा क्या मतलब है। यह अनुमानित नहीं होगा।

जो भी आप ढूंढ रहे हैं उसे प्राप्त करने के लिए कोई आधिकारिक रूप से समर्थित तरीका नहीं है, लेकिन आप शायद अपने आप को एक समाधान हैक कर सकते हैं। कुछ इस तरह:

public static object ResolveUntypedNamed(
    this IComponentContext context, 
    string serviceName) 
{ 
    var component = context.ComponentRegistry.Registrations 
    .Where(r => r.Services.OfType<KeyedService>() 
     .Any(s => s.ServiceKey.Equals(serviceName))) 
    .FirstOrDefault(); 
    return context.ResolveComponent(component, Enumerable.Empty<Parameter>()); 
} 

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

यदि आप अपने ऐप में डायनामिक पंजीकरण सामग्री का उपयोग नहीं कर रहे हैं, तो आप शायद सुरक्षित हैं। बस जागरूक रहें कि आप इस तरह के कुछ के साथ चारों तरफ जा रहे हैं और आपको अपेक्षित नतीजे नहीं मिल सकते हैं। अगर/जब अजीब चीजें हो रही हैं, आपको चेतावनी दी गई है।

यदि आप अनचाहे सेवाओं को "सही तरीके से पंजीकृत करना और हल करना चाहते हैं, तो आपको शायद अपने स्वयं के Autofac.Core.Service को लागू करने की आवश्यकता होगी। कुंजी/नामांकित पंजीकरण Autofac.Core.KeyedService हैं लेकिन वे हमेशा एक प्रकार से जुड़े होते हैं; आपके कस्टम को टाइप नहीं किया जाना चाहिए। इसके बाद आप ContainerBuilder आप की तरह कुछ कर सकते हैं ऐसी है कि पर अपने खुद के पंजीकरण एक्सटेंशन लागू करने की आवश्यकता होगी:

builder.RegisterUntypedNamed(someObject, "name-here"); 

... और फिर तुम भी तो अपने सेवा प्रकार हल करने IComponentContext पर एक इसी विस्तार आवश्यकता होगी ...

container.ResolveUntypedNamed("name-here"); 

जबकि अभी भी देर से ही सीमित पंजीकरण/स्कैनिंग सामान है कि पर्दे के पीछे पर चला जाता है के सभी में भाग लेने: आप सही तरीके से कर सकता है।

+0

बेहद गहन उत्तर के लिए धन्यवाद। कारण मैं पूछ रहा हूं क्योंकि मैं कैलिबर्न माइक्रो के बाइंड का उपयोग कर रहा हूं। मॉडल निर्भरता संपत्ति। कैलिब्रर्न डीआई कंटेनर से व्यूमोडेल को हल करने के लिए उस कुंजी को प्रदान किए गए मान का उपयोग करता है। प्रकार के साथ पारित नहीं किया गया है। मैंने जो किया है वह है Bind.Model = <पूरी तरह से योग्य नाम> और फिर Type.GetType (पूरी तरह से योग्य नाम) सेट करना है।इस प्रकार के साथ, मैं ऑटोफैक पर जा सकता हूं। –