Ninject:可以加载声明为internal的模块

Tim*_*oyd 7 ninject

是否可以将Ninject配置为加载已声明为的模块internal

我已经尝试配置InternalVisibleToNinject程序集,但这没有帮助.

我当然可以制作模块public,但实际上它们应该是internal.

mry*_*ren 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以做以下事情.

var modules = NinjectModuleScanner.GetNinjectModules(assemblies).ToArray();
var kernel = new StandardKernel();
Run Code Online (Sandbox Code Playgroud)

此解决方案尚未经过测试.


Mar*_*rio 5

您可以使用类中的InjectNonPublic属性配置Ninject以注入内部NinjectSettings类.你必须将它作为参数传递给StandardKernel构造函数:

var settings = new NinjectSettings
{
    InjectNonPublic = true
};
kernel = new StandardKernel(settings);
Run Code Online (Sandbox Code Playgroud)