2012-02-06 12 views
11

के लिए ऑटोफैक स्कैनिंग असेंबली मैंने ऑटोफैक का उपयोग करना शुरू कर दिया है और कुछ डीएलएल स्कैन करना चाहते हैं और ऑटोफैक को उनके भीतर कुछ कक्षाओं को पंजीकृत करने के लिए प्राप्त करना चाहते हैं।कुछ वर्ग प्रकार

कक्षाएं जिन्हें मैं सभी प्लगइनबेस वर्ग से प्राप्त करता हूं, लेकिन नीचे दिया गया कोड उन्हें पंजीकृत नहीं कर रहा है। क्या कोई मदद कर सकता है?

builder 
    .RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()) 
    .Where(t => t.GetInterfaces() 
     .Any(i => i.IsAssignableFrom(typeof (IDependency)))) 
    .AsImplementedInterfaces() 
    .InstancePerDependency(); 

इस कोड में मैं IDependency एक मार्कर इंटरफेस के रूप में उपयोग करें:

 var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 


     var builder = new ContainerBuilder(); 
     builder.RegisterAssemblyTypes(assemblies) 
      .Where(t => t.BaseType == typeof(PluginBase)) 
      .AsImplementedInterfaces() 
      .AsSelf(); 

     var container = builder.Build(); 
     var pluginClasses = container.Resolve<IEnumerable<PluginBase>>(); 

     //pluginClasses is empty!!!! 

उत्तर

18

मुझे लगता है कि आपको पंजीकरण पर अपने प्लगइन की बेस क्लास निर्दिष्ट करने की आवश्यकता है। कॉल AsImplementedInterfaces अपने कार्यान्वित इंटरफेस के साथ प्रकार को पंजीकृत करता है, न कि इसके मूल प्रकार से। प्लगइनबेस के रूप में अपने प्लगइन को पंजीकृत करने के लिए आपको अपना पंजीकरण अपडेट करना चाहिए।

Here's कोड:

var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 


    var builder = new ContainerBuilder(); 
    builder.RegisterAssemblyTypes(assemblies) 
     .Where(t => t.BaseType == typeof(PluginBase)) 
     .As<PluginBase>(); 

    var container = builder.Build(); 
    var pluginClasses = container.Resolve<IEnumerable<PluginBase>>(); 
+0

अटक गया है! क्या मैं नए वर्गों के लिए असीमित इंटरफेस जोड़ सकता हूं जो इंटरफेस को कार्यान्वित करता है? – Jon

+0

मुझे लगता है कि इन दो कॉलों को एकसाथ काम करना चाहिए। फिर प्रकार के साथ पंजीकृत हो जाता है I टीएस बेस प्रकार और यह सभी इंटरफेस लागू करता है। – Jehof

+0

ओह, मैंने जो लिखा है उसे दोबारा पढ़ें और समझ में नहीं आता है। अगर मेरे पास एक कक्षा है जो प्लगइनबेस से विरासत में है और इसमें इंटरफ़ेस का कन्स्ट्रक्टर तर्क है तो यह AsImplementedInterfaces के साथ भी काम नहीं करेगा। क्या मैं एक नया बिल्डर पंजीकरण करता हूं या क्या मैं वर्तमान कोड में संशोधन कर सकता हूं? – Jon

7

हो सकता है कि ऐसा इस तरह से है। आप इसे अपने PluginBase कक्षा से बदल सकते हैं और Where विधि को हटा सकते हैं।

बिंदु IsAssignableFrom विधि का उपयोग करना है।

+0

विल कि कक्षाओं कि इंटरफेस और उन है कि लागू नहीं करते के लिए अनुमति देते? मैं विरासत कोड के साथ काम कर रहा हूं, इसलिए पुराने सामान में इंटरफेस नहीं होंगे लेकिन नई सामग्री – Jon

+0

होगी जहां यह (टी => टी.आईएसएस्सिग्नेबल फ्रॉम (टाइपऑफ (प्लगइनबेस)) 'के साथ काम करना चाहिए। यदि नहीं, तो मैं आपकी मदद करने की कोशिश करूंगा। – Wojteq

+0

यह मुझे डर नहीं है – Jon