2011-06-23 59 views

回答

7

內部KernalBase.Load(IEnumerable<Assembly assemblies)使用GetExportedTypes(),它只返回公共類型。

但是,您可以編寫自己的「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; 
    } 
} 

然後,您可以執行以下操作。

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

雖然此解決方案尚未經過測試。

+0

工作得非常好,沒想到快到會這樣,因爲我一直在尋找建於感謝東西。 –

4

您可以配置Ninject使用NinjectSettings類的InjectNonPublic屬性注入內部類。你必須把它作爲參數傳遞給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);