我是一个新手,所以如果这是可能的,我会遇到一些麻烦,更不用说怎么做了。
基本上,我希望有一个目录,其中有许多插件dll的在运行时加载。dlls中的所有插件都将实现2+接口。第一个接口是IPlugin,它包含初始化和停止插件的方法。其余的接口将是插件提供/实现的特性的接口。当我需要实现其中一个接口的东西时,我会向对象/插件管理器请求实现该特性/接口的所有插件的实例,这样我就可以调用它们。另一个问题是,我需要加载和返回每个插件的单个实例,所以如果一个插件实现了3个接口/特性,那么每当我请求这些特性/接口中的任何一个时,都会返回单个实例。
最后,我需要在没有配置xml文件或硬编码映射的情况下动态完成这一切。此外,如果可能的话,我很乐意使用ninject来填充构造函数属性,但是如果太难了,我可以通过IPlugin接口上的方法来实现。
我知道这有点复杂,但我希望有人能帮助我,或者至少给我指明正确的方向。我已经看过大多数插件系统上的其他帖子了,但它们都是基于一个通用的界面。在我的例子中,公共接口仅用于设置,其余接口不同,因此它们似乎都不匹配。此外,如果可能的话,我不希望插件以任何方式引用对象。
到目前为止,我已经尝试了以下方法,它似乎很有效,所以现在我只需要在插件之间做一些依赖关系
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();
}
}发布于 2012-11-20 09:15:34
好吧,我觉得有点愚蠢,但我在第一篇文章中编辑的上述第一次尝试工作得非常好,并且处理了构造函数中的插件间依赖关系等。我从来没有意识到用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();
}
}https://stackoverflow.com/questions/13449328
复制相似问题