是否有可能配置Ninject以加载已声明为internal
的模块?
我尝试为Ninject程序集配置InternalVisibleTo
,但这并没有帮助。
当然,我可以将模块设置为public
,但它们应该是internal
。
是否有可能配置Ninject以加载已声明为internal
的模块?
我尝试为Ninject程序集配置InternalVisibleTo
,但这并没有帮助。
当然,我可以将模块设置为public
,但它们应该是internal
。
在内部,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();
尽管这个解决方案还没有经过测试。
NinjectSettings
类的 InjectNonPublic
属性来配置 Ninject 以注入内部类。你需要将其作为参数传递给 StandardKernel
构造函数: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);