1

我对 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();
    }
}
4

1 回答 1

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();
    }
}
于 2012-11-20T01:15:34.097 回答