是否可以配置Ninject加載已聲明爲internal
的模塊?Ninject:可以加載聲明爲內部的模塊
我嘗試過爲Ninject組件配置InternalVisibleTo
,但這沒有幫助。
我當然可以使模塊public
,但他們真的應該是internal
。
是否可以配置Ninject加載已聲明爲internal
的模塊?Ninject:可以加載聲明爲內部的模塊
我嘗試過爲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();
雖然此解決方案尚未經過測試。
您可以配置Ninject使用NinjectSettings
類的InjectNonPublic
屬性注入內部類。你必須把它作爲參數傳遞給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);
工作得非常好,沒想到快到會這樣,因爲我一直在尋找建於感謝東西。 –