2011-06-23 10 views

Odpowiedz

7

Wewnętrznie KernalBase.Load(IEnumerable<Assembly assemblies) używa GetExportedTypes(), który zwraca tylko typy publiczne.

Można jednak napisać własny "skaner 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; 
    } 
} 

Następnie można wykonać następujące czynności.

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

To rozwiązanie nie zostało jeszcze przetestowane.

+0

działa bardzo dobrze, nie myślał o zbliża go tak jak ja szukałem czegoś zbudowany dzięki.. –

4

Możesz skonfigurować Ninject do wstrzykiwania klas wewnętrznych za pomocą właściwości InjectNonPublic z klasy NinjectSettings. Trzeba przekazać go jako argument konstruktora StandardKernel:

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); 
Powiązane problemy