在Ninject.Extensions.Conventions的早期版本中,扫描目录以获取程序集,按接口过滤类,然后加载所有包含ninject模块的内容非常容易。
kernel.Scan(scanner =>
scanner.FromAssembliesInPath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))
scanner.AutoLoadModules();
scanner.WhereTypeInheritsFrom<IPlugin>());
public class MyPlugin : NinjectModule, IPlugin {
public override void Load() {
Bind<IRepositoryFromPluginHost>().To<MyPluginImpl>().Named("special");
}
}
然而,在我最近更新到最新版本后,一切似乎都消失了,我无法
有人有解决方案吗?
答案 0 :(得分:4)
仍有https://github.com/ninject/ninject.extensions.conventions扩展名。 但是,界面已经改变,改为:
kernel.Bind(x =>
{
x.FromAssembliesInPath("somepath")
.IncludingNonePublicTypes()
.SelectAllClasses()
.InheritedFrom<IPlugin>()
.BindDefaultInterface() // Binds the default interface to them;
});
更新:
如何使用约定扩展(如上所述)将所有IPlugin
绑定到IPlugin
,然后执行:
var plugins = IResolutionRoot.GetAll<IPlugin>();
kernel.Load(plugins);
答案 1 :(得分:1)
也许很难,但是这样的东西会得到一个从NinjectModule派生的类型列表。
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
List<Type> types = new List<Type>();
foreach (var assembly in assemblies)
{
types.AddRange(GetModules(assembly));
}
IEnumerable<Type> GetModules(Assembly assembly)
{
assembly.GetTypes()
.Where(t => t.BaseType == typeof(NinjectModule));
}
要加载模块,请尝试此操作。
(Activator.CreateInstance(type)as NinjectModule).Load();