Ninject会自动注入非绑定类吗?

时间:2010-10-02 17:42:23

标签: dependency-injection ninject

public class MyController : Controller
{
   private MyClass _class;

   public MyController(MyClass class)
   {
       this._class = class;
   }
}

public class MyClass
{
      // stuff
}

我的Ninject被连接到注入实现IController的类(Controller类这样做)。但是,我没有将MyClass绑定到任何内容,但Ninject仍在MyClass注入MyController

我想我的问题是,为什么它会注入一些我没有绑定到任何东西的东西? Ninject是否会找到带有签名MyClass的班级?我假设如果我的构造函数需要MyBaseClass并且我的程序集中有两个继承自MyBaseClass的类,则此行为会有所不同吗?

1 个答案:

答案 0 :(得分:8)

在Ninject V1中,ImplicitSelfBinding是一个顶级配置设置(默认为真正的IIRC)。

在V2中,您观察到的隐式自绑定行为更加深入(虽然有一些方法可以将其关闭 - 就像Ninject的大多数位一样,它非常精细且极小)。在V2中,默认行为是,如果不存在其他绑定,则始终生成具体类型的自绑定。您通常只执行Bind<Concrete>().ToSelf()的操作是自定义绑定,例如,执行.InSingletonScope()

有关在V2 +中关闭它的方法,请参见此answer by @Remo Gloor

立即在源代码中为ImplicitSelfBinding做一个grep - 虽然它比人们喋喋不休更容易阅读!

另外不要忘记查看Ninject.Extensions.Conventions并在ninject.org上进行测试,以便将Bind()隐式I*X*安排到*X*

(正如史蒂文提到的,如果你将MyClass课程改为abstract,Ninject将不会自我约束。)