1

Ninject 的许多示例都非常非常基础。它要么只是一个控制器,要么他们在一个函数中创建内核和对象以用于演示目的。

所以出于某种原因,我认为你可以像正常一样实例化一个对象,Ninject 会拦截它并工作。例如:

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

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

var fooObject = new foo();

那么我应该改用 kernel.get 吗?

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

4

2 回答 2

1

如果您的应用程序设计得很好,那么您的应用程序中应该只Kernel.Get发生一个请求(通常通过类似的东西Ninject.MVC3)。通常这就是应用程序的根对象被实例化的地方(例如应用程序外壳的 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
   }
}

并且应用程序在不访问其他地方的内核的情况下自行构建。

请参阅该位的工厂扩展ToFactory()

于 2012-08-16T17:02:12.293 回答
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();
    }
}
于 2012-08-17T04:03:47.900 回答