首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ninject 3插件系统

Ninject 3插件系统
EN

Stack Overflow用户
提问于 2012-11-19 15:26:29
回答 1查看 963关注 0票数 1

我是一个新手,所以如果这是可能的,我会遇到一些麻烦,更不用说怎么做了。

基本上,我希望有一个目录,其中有许多插件dll的在运行时加载。dlls中的所有插件都将实现2+接口。第一个接口是IPlugin,它包含初始化和停止插件的方法。其余的接口将是插件提供/实现的特性的接口。当我需要实现其中一个接口的东西时,我会向对象/插件管理器请求实现该特性/接口的所有插件的实例,这样我就可以调用它们。另一个问题是,我需要加载和返回每个插件的单个实例,所以如果一个插件实现了3个接口/特性,那么每当我请求这些特性/接口中的任何一个时,都会返回单个实例。

最后,我需要在没有配置xml文件或硬编码映射的情况下动态完成这一切。此外,如果可能的话,我很乐意使用ninject来填充构造函数属性,但是如果太难了,我可以通过IPlugin接口上的方法来实现。

我知道这有点复杂,但我希望有人能帮助我,或者至少给我指明正确的方向。我已经看过大多数插件系统上的其他帖子了,但它们都是基于一个通用的界面。在我的例子中,公共接口仅用于设置,其余接口不同,因此它们似乎都不匹配。此外,如果可能的话,我不希望插件以任何方式引用对象。

到目前为止,我已经尝试了以下方法,它似乎很有效,所以现在我只需要在插件之间做一些依赖关系

代码语言:javascript
运行
复制
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();
    }
}
EN

回答 1

Stack Overflow用户

发布于 2012-11-20 09:15:34

好吧,我觉得有点愚蠢,但我在第一篇文章中编辑的上述第一次尝试工作得非常好,并且处理了构造函数中的插件间依赖关系等。我从来没有意识到用Ninject做这件事这么容易,所以我把它贴在这里,作为其他试图做类似事情的人的答案,但我不太了解Ninject。

代码语言:javascript
运行
复制
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();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13449328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档