是否可以将Ninject配置为加载已声明为internal
的模块?
我尝试为Ninject程序集配置InternalVisibleTo
,但这没有帮助。
我当然可以制作模块public
,但实际上它们应该是internal
。
答案 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);