使用NinjectModule的构造函数参数

时间:2016-08-11 06:09:23

标签: c# ninject

我有以下方案为我的应用程序声明导出插件:

public abstract class PluginBase : NinjectModule
{
    protected PluginBase(IDataSource source)
    {
         // ...
    }

    public override void Load()
    {
         Bind<PluginBase>().To(GetType());
    }
}
public class RealPlugin : PluginBase
{
    public RealPlugin(IDataSource source)
    {
        // ...
    }
}

不幸的是,Kernel.Load(AssemblyName)似乎没有将RealPlugin检测为可加载元素,并且从不调用Load()方法。如果我添加一个没有参数的额外公共构造函数,它可以工作。但是,我实际上不想这样做,因为我不希望任何人在没有指定数据源的情况下创建RealPlugin实例。

一个丑陋的解决方法似乎是用[Obsolete]标记无参数构造函数,这至少可以防止意外使用它们。

当然,我也可以创建从NinjectModule派生的单独类来创建Bindings,但这需要为我的每个插件提供另一个类,这也不是那么好(并且防止绑定到实例的动态类型,如见上文)

任何人都知道如何在没有公共无参数构造函数的情况下注册这样的插件?

1 个答案:

答案 0 :(得分:0)

在反思中,默认情况下,只有&#34; public&#34;类型被考虑。显然ninject使用默认值。因此,您必须推出自己的实现,该实现使用反射来查找符合所有这些条件的所有类:

  • 继承自NinjectModule(也间接)
  • 不是抽象的
  • 有一个无参数构造函数

然后这些需要实例化并传递给Kernel.Load(NinjectModule)

您也可以查看Kernel.Load(AssemblyName)的源代码,并根据您的需要进行复制和修改。很可能使用反射的代码只需要在一个或两个地方false切换到true - 或者使用不同的方法重载来考虑非公共成员。