2012-02-06 12 views
11

için Autofac Tarama Meclisleri Autofac'ı kullanmaya başladım ve bazı DLL'leri taramak ve bunların içindeki bazı sınıfları kaydetmek için Autofac'ı almak istiyorum.Bazı sınıf tipi

Bir PluginBase sınıfından, ancak aşağıdaki koddan devraldığım tüm sınıflar, bunları kaydettiriyor gibi görünmüyor. Biri yardım edebilir mi? Bir işaretleyici arayüz olarak IDependency kullanmak Bu kodda

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

: Belki do

 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!!!! 

cevap

18

Kayıt sırasında Eklentilerinizin temel sınıfını belirtmeniz gerektiğini düşünüyorum. AsImplementedInterfaces numaralı çağrı, türü temel arabirimiyle değil, uygulanan arabirimleriyle kaydeder. Eklentilerinizi PluginBase olarak kaydetmek için kaydınızı güncellemeniz gerekir.

Here's kodu: arayüzleri ve yapılacak olanları uygulamak gerekmez sınıflar için izin

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

Daha yeni sınıflar için AsImplementedInterfaces ekleyebilir miyim? Arayüzleri uygular mı? – Jon

+0

Bu iki aramanın birlikte çalışması gerektiğini düşünüyorum. ts taban tipi ve uyguladığı tüm arayüzler. – Jehof

+0

Hata! Sadece yazdıklarımı tekrar okudum ve anlamlı değil. PluginBase'den miras alan bir sınıfım varsa ve bir arabirimin yapıcı bir argümanı varsa, bu AsImplementedInterfaces ile bile çalışmaz. Yeni bir üretici kaydı mı yaparım yoksa mevcut kodu değiştirebilir miyim? – Jon

7

bu yoldur. Bunu, PluginBase sınıfınızla değiştirebilir ve Where yöntemini kaldırabilirsiniz.

Amaç, IsAssignableFrom yöntemini kullanmaktır.

+0

Will? Eski kodlarla çalışıyorum bu yüzden eski şeyler arayüzlere sahip değil ama yeni şeyler – Jon

+0

olacaktır. Nerede çalışması gerekir? (T => t.IsAssignableFrom (typeof (PluginBase)) '. Değilse, size yardımcı olmaya çalışacağım. – Wojteq

+0

Korkmuyor muyum – Jon