我对Ninject有点新意,所以如果可能的话,我会遇到一些麻烦,更不用说怎么做了。
基本上我想要一个目录,其中包含许多在运行时加载的插件dll。 dll中的所有插件都将实现2个以上的接口。第一个接口将是IPlugin,并将包含对插件进行intilalise并停止它的方法。其余接口将是插件提供/实现的功能的接口。当我需要实现其中一个接口的东西时,我向ninject /插件管理器询问实现该功能/接口的所有插件的实例,以便我可以调用它们。另一个问题是我需要作为每个插件的单个实例加载和返回,所以如果插件实现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();
}
}
答案 0 :(得分:0)
好吧,我觉得有点愚蠢,但上面第一次尝试我编辑到我的第一篇文章工作得很好,并处理构造函数等插件依赖关系。我从来没有意识到这将是很容易与Ninject,所以我发布它这里作为其他人尝试做类似的事情的答案,但不太了解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> GetPluginInstances<T>()
{
return kernel.GetAll<T>();
}
public void Dispose()
{
kernel.Dispose();
}
}