Ninject 3插件系统

时间:2012-11-19 07:26:29

标签: c# c#-4.0 plugins ninject

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

1 个答案:

答案 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();
    }
}