我对 Ninject 有点陌生,所以我很难弄清楚这是否可能,更不用说如何去做了。
基本上我想要一个目录,其中包含许多在运行时加载的插件 dll。dll 中的所有插件都将实现 2+ 接口。第一个接口将是 IPlugin 并将包含用于安装插件和停止它的方法。其余接口将是插件提供/实现的功能的接口。当我需要实现其中一个接口的东西时,我会向 ninject/plugin manager 询问实现该功能/接口的所有插件的实例,以便我可以调用它们。另一个问题是我需要作为每个插件的单个实例来加载和返回,所以如果一个插件实现了 3 个接口/功能,那么当我要求任何这些功能/接口时,都会返回单个实例。
最后,我需要在没有配置 xml 文件或硬编码映射的情况下动态完成这一切。此外,如果可能的话,如果可能的话,我很想使用 ninject 来填充构造函数属性,但如果这太难了,我可以通过 IPlugin 接口上的方法来做到这一点。
我知道这有点复杂,但我希望有人可以帮助我或至少为我指明正确的方向。我查看了关于插件系统的大多数其他帖子,但它们都基于一个通用界面。在我的情况下,通用接口仅用于设置,其余接口不同,因此它们似乎都不匹配。此外,如果可能的话,我不希望插件以任何方式引用 ninject。
到目前为止,我已经尝试了以下,它似乎工作,所以我现在只需要在插件之间做一些依赖
public class PluginManager:IDisposable
{
IKernel kernel;
public PluginManager()
{
kernel = new StandardKernel();
kernel.Bind(
x => x.FromThisAssembly()
.SelectAllClasses().InheritedFrom<IPlugin>()
.BindAllInterfaces()
.Configure(c =>c.InSingletonScope()));
}
public T GetPluginInstance<T>()
{
return kernel.Get<T>();
}
public IEnumerable<T> GetAllPluginInstances<T>()
{
return kernel.GetAll<T>();
}
public void Dispose()
{
kernel.Dispose();
}
}