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

时间:2011-06-23 13:29:41

标签: ninject

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

我尝试为Ninject程序集配置InternalVisibleTo,但这没有帮助。

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

3 个答案:

答案 0 :(得分: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();

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:0)

var kernel = new StandardKernel();

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

kernel.Load(modules);