在使用Ninject时,是否必须调用kernel.Get来实例化对象?

时间:2012-08-16 00:55:03

标签: asp.net-mvc-3 c#-4.0 ninject

Ninject的很多例子非常非常基本。它只是一个控制器,或者它们在一个函数中创建内核和对象以用于演示目的。

因此,出于某种原因,我认为你可以像普通的那样实例化一个对象,而Ninject会拦截它并起作用。例如:

public class foo 
{
    public foo(IInjectable injected)
    {
       //stuff
    }
}

然后你可以在另一个班级的某个地方做:

var fooObject = new foo();

我应该使用kernel.get吗?

然后,如果我需要继续调用内核,我该如何将它传递给需要它的所有内容?

2 个答案:

答案 0 :(得分:1)

如果你很好地设计你的应用程序,那么你的应用程序中应该只发生一个Kernel.Get请求(通常通过类似Ninject.MVC3之类的东西)。通常,这是应用程序的根对象实例化的位置(例如,应用程序shell的MainViewModel)。所有其他类型只是在构造函数中声明它们的依赖项,而不知道谁负责创建和管理它们的依赖项。小例子

public class Main {
   // Somewhere
   var mainViewModel = Kernel.Get<MainViewModel>();
   mainViewModel.Initialize();
}

public class MainViewModel {
    ctor(ISectionViewModelFactory factory, ISectionViewModel sectionViewModel) {
    }

    public void Initialize() {
       // use injected factory etc.
    }
}

public class ApplicationModule : NinjectModule {

   public override void Load() {
      Bind<ISectionViewModel>().To<SectionViewModel>();
      Bind<ISectionViewModelFactory>().ToFactory(); // <-- requires factory extension
   }
}

并且应用程序自行构建而无需在其他地方访问内核。

请参阅the factory extension了解ToFactory()位。

答案 1 :(得分:0)

这里的方法只有在你注入 foo 时才会起作用(一般来说,开始将内核注入你的类并不是一个好主意,因为它开始取消反转控制的反转,可以这么说)。

没有一些上下文很难说,但是我们说上面的代码包含在另一个类 bar 中。然后你就这样继续下去:

public class bar
{
    foo _fooObject;

    public bar(foo fooObject)
    {
        _fooObject = fooObject;
    }
}

然后当然会设置 foo 的绑定,例如:

Bind<foo>.ToSelf();

如果您需要在 bar 中创建 foo 的多个实例,那么您可以使用工厂:

public class bar
{
    fooFactory _factory;

    public bar(fooFactory factory)
    {
        _factory = factory;
    }

    void baz()
    {
        foo fooObject = _factory.GetNew();
    }
}