2011-06-23 9 views

Respuesta

7

Internamente KernalBase.Load(IEnumerable<Assembly assemblies) usa el GetExportedTypes() que solo devuelve tipos públicos.

Sin embargo, podría escribir su propio "escáner NinjectModule".

public static class NinjectModuleScanner 
{ 
    public static IEnumerable<INinjectModule> 
     GetNinjectModules(IEnumerable<Assembly assemblies) 
    { 
     return assemblies.SelectMany(assembly => assembly.GetNinjectModules()); 
    } 
} 

public static class AssemblyExtensions 
{ 
    public static IEnumerable<INinjectModule> 
     GetNinjectModules(this Assembly assembly) 
    { 
     return assembly.GetTypes() 
      .Where(IsLoadableModule) 
      .Select(type => Activator.CreateInstance(type) as INinjectModule); 
    } 

    private static bool IsLoadableModule(Type type) 
    { 
     return typeof(INinjectModule).IsAssignableFrom(type) 
      && !type.IsAbstract 
      && !type.IsInterface 
      && type.GetConstructor(Type.EmptyTypes) != null; 
    } 
} 

Luego puede hacer lo siguiente.

var modules = NinjectModuleScanner.GetNinjectModules(assemblies).ToArray(); 
var kernel = new StandardKernel(); 

Aunque esta solución no se ha probado.

+0

funciona muy bien, no había pensado en acercarse a ella de esa manera como yo estaba buscando algo construido en Gracias.. –

4

Puede configurar Ninject para inyectar clases internas utilizando la propiedad InjectNonPublic de la clase NinjectSettings. Usted tiene que pasar como argumento a la StandardKernel constructor:

var settings = new NinjectSettings 
{ 
    InjectNonPublic = true 
}; 
kernel = new StandardKernel(settings); 
0
var kernel = new StandardKernel(); 

var modules = Assembly 
        .GetExecutingAssembly() 
        .DefinedTypes 
        .Where(typeof(INinjectModule).IsAssignableFrom) 
        .Select(Activator.CreateInstance) 
        .Cast<INinjectModule>(); 

kernel.Load(modules); 
Cuestiones relacionadas