使用构造函数参数与NinjectModule

本文关键字:NinjectModule 参数 构造函数 | 更新日期: 2023-09-27 18:02:06

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

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的单独类来创建绑定,但这需要为我的每个插件创建另一个类,这也不是很好(并且防止绑定到实例的动态类型,如上所示)

有没有人知道这样一个插件可以注册没有一个公共无参数的构造函数?

使用构造函数参数与NinjectModule

在Reflection中,默认情况下,只考虑"public"类型。显然,ninject使用默认值。因此,您必须滚动自己的实现,使用反射来查找符合所有这些条件的所有类:

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

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

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