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);
精彩评论