Ninject的很多例子非常非常基本。它只是一个控制器,或者它们在一个函数中创建内核和对象以用于演示目的。
因此,出于某种原因,我认为你可以像普通的那样实例化一个对象,而Ninject会拦截它并起作用。例如:
public class foo
{
public foo(IInjectable injected)
{
//stuff
}
}
然后你可以在另一个班级的某个地方做:
var fooObject = new foo();
我应该使用kernel.get吗?
然后,如果我需要继续调用内核,我该如何将它传递给需要它的所有内容?
答案 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();
}
}