2012-02-06 14 views
11

Comencé a usar Autofac y quiero escanear algunas DLL y obtener Autofac para registrar algunas de las clases dentro de ellas.Conjuntos de escaneo Autofac para cierto tipo de clase

Las clases que me interesan todas heredan de una clase PluginBase pero el código siguiente no parece estar registrándolas. ¿Alguien puede ayudar?

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

Respuesta

18

Creo que necesita especificar la clase base de sus complementos en el registro. La llamada AsImplementedInterfaces registra el tipo con sus interfaces implementadas y no por su tipo de base. Debe actualizar su registro para registrar sus complementos como PluginBase.

tope aquí tienes el código:

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

¡Eso funciona! ¿Podría agregar AsImplementedInterfaces para las clases más nuevas? que implementan las interfaces? – Jon

+0

Creo que estas dos llamadas deberían funcionar juntas. Luego el tipo se registra con i ts base type y todas las interfaces que implementa. – Jehof

+0

Vaya, solo vuelva a leer lo que escribí y no tiene sentido. Si tengo una clase que hereda de PluginBase y tiene un argumento constructor de una interfaz, esto no funcionará incluso con AsImplementedInterfaces. ¿Hago un nuevo registro de generador o puedo modificar el código actual? – Jon

7

Tal es hacer de esta manera:

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

En este código utilizo IDependency como una interfaz de marcador. Puede reemplazarlo con su clase PluginBase y eliminar el método Where.

El punto es utilizar el método IsAssignableFrom.

+0

Will que permiten clases que no implementan las interfaces y los que lo hacen? Estoy trabajando con código heredado así que las cosas viejas no tienen interfaces pero las cosas nuevas serán – Jon

+0

Debería funcionar con 'Where (t => t.IsAssignableFrom (typeof (PluginBase))'. De lo contrario, intentaré ayudarte. – Wojteq

+0

No me temo – Jon

Cuestiones relacionadas