2013-04-02 20 views
11

के साथ ऑटोफैक पंजीकरण ओवरराइड करें मेरे पास IFoo सेवा DefaultFoo द्वारा लागू की गई है, और मैंने इसे अपने ऑटोफैक कंटेनर में पंजीकृत किया है।प्लगइन

अब मैं प्लगइन असेंबली में लागू होने के लिए IFoo के वैकल्पिक कार्यान्वयन की अनुमति देना चाहता हूं, जिसे "प्लगइन्स" फ़ोल्डर में छोड़ा जा सकता है। यदि यह मौजूद है तो इस वैकल्पिक कार्यान्वयन को प्राथमिकता देने के लिए मैं ऑटोफैक को कैसे कॉन्फ़िगर कर सकता हूं?

उत्तर

11

यदि आप कुछ इंटरफ़ेस कार्यान्वयन पंजीकृत करते हैं, तो ऑटोफ़ैक नवीनतम पंजीकरण का उपयोग करेगा। अन्य पंजीकरण ओवरराइड किया जाएगा। आपके मामले में, प्लगइन मौजूद होने पर ऑटोफैक प्लगइन पंजीकरण का उपयोग करेगा और अपने IFoo सेवा कार्यान्वयन को पंजीकृत करेगा।

यदि एक से अधिक घटक एक ही सेवा का खुलासा करते हैं, तो ऑटोफैक अंतिम पंजीकृत घटक का उपयोग उस सेवा के डिफ़ॉल्ट प्रदाता के रूप में करेगा।

Default Registrations

+0

क्या ऑटोफैक के साथ यह अपेक्षित व्यवहार है, या सिर्फ संयोग है? क्या आपके पास कोई संदर्भ है? –

+2

यह सुझाव देता है कि यह अपेक्षित है: http://docs.autofac.org/en/latest/register/registration.html#default-registrations –

+1

ध्यान दें कि अन्य पंजीकरण ओवरराइड नहीं हैं! ऑटोफैक केवल अंतिम पंजीकृत घटक का उपयोग करेगा, लेकिन पिछले घटकों को अभी भी हल किया जा सकता है (उदाहरण के लिए > हल करें) –

1

रूप Memoizer ने कहा, नवीनतम पंजीकरण पहले वाले को ओवरराइड करता है देखें। मैं इस तरह कुछ खत्म हो गया:

// gather plugin assemblies 
string applicationPath = Path.GetDirectoryName(
    Assembly.GetEntryAssembly().Location); 
string pluginsPath = Path.Combine(applicationPath, "plugins"); 
Assembly[] pluginAssemblies = 
    Directory.EnumerateFiles(pluginsPath, "*.dll") 
    .Select(path => Assembly.LoadFile(path)) 
    .ToArray(); 

// register types 
var builder = new ContainerBuilder(); 
builder.Register<IFoo>(context => new DefaultFoo()); 
builder.RegisterAssemblyTypes(pluginAssemblies) 
    .Where(type => type.IsAssignableTo<IFoo>()) 
    .As<IFoo>(); 

// test which IFoo implementation is selected 
var container = builder.Build(); 
IFoo foo = container.Resolve<IFoo>(); 
Console.WriteLine(foo.GetType().FullName); 
+0

यह परीक्षण के लिए बहुत उपयोगी है क्योंकि यह _default_ registrations को उनके _test_ समकक्षों के साथ ओवरराइड करने की अनुमति देता है। – t3chb0t

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