开发者

Ninject: Can modules be loaded that are declared as internal

开发者 https://www.devze.com 2023-03-15 02:58 出处:网络
Is it at all possible to configure Ninjec开发者_StackOverflow中文版t to load modules that have been declared as internal?

Is it at all possible to configure Ninjec开发者_StackOverflow中文版t to load modules that have been declared as internal?

I have tried configuring InternalVisibleTo for the Ninject assembly, but this does not help.

I can of course make the modules public, but really they should be internal.


Internally KernalBase.Load(IEnumerable<Assembly assemblies) uses the GetExportedTypes() which only returns public types.

However, you could write your own "NinjectModule scanner".

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;
    }
}

Then you could do the following.

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

This solution has not been tested though.


You can configure Ninject to inject internal classes using the InjectNonPublic property from NinjectSettings class. You have to pass it as an argument to the StandardKernel constructor:

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


var kernel = new StandardKernel();

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

kernel.Load(modules);
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号