Castle Windsor“Container”和“Kernel”有什么区别?

时间:2014-08-14 07:48:16

标签: c# castle-windsor ioc-container

我开始使用Windsor,我想了解何时应该使用container和何时使用kernel。 E.g。

var c = new WindsorContainer();
c.Register(Component.For<ITt>().ImplementedBy<Tt>());
var tt = c.Resolve<ITt>();

一切都很好,一切正常, 但这里也有c.kernel可以做同样的事情,为什么?

var c = new WindsorConatiner();
c.kernel.Register(Component.For<ITt>().ImplementedBy<Tt>());
var tt = c.kernel.Resolve<ITt>();

老实说我不 理解 差异 之间 容器 strong>“和”内核“这个词。在我看来,它听起来像是不同IoC库中同一个东西的两个名字?

P.S。我读了这个post但是仍然无法理解这里有两个实现一个功能的原因是什么?

更新 刚刚在我的代码中找到了这样的行

      c.Kernel.Resolver.AddSubResolver(new ArrayResolver(c.Kernel));

通过内核做到这一点的原因是什么?我完全失去了

1 个答案:

答案 0 :(得分:14)

它们今天大部分都是等价的,但最初IKernel和IWindsorContainer生活在不同的程序集中,Windsor容器包裹内核。两者在某些时候合并,但保持活着,以确保可能已经使用过一个或另一个的用户的向后兼容性。

由于合并发生在版本2.5(如链接帖子中所讨论的),因此可以合理地假设有一些不可忽略的用户可能在一个界面或另一个界面上工作,因此您现在看到了这个问题。 / p>

查看代码,您可以看到几乎所有来自windsor容器的代码都在内部调用内核,为child containers功能添加了一些行为,另一个选项为r emains from the past and is not necessarily useful

  

对于那些虽然我真的要删除对嵌套的支持的人   容器放心,这不会发生。我依然认为   这可能是一个可行的选择,我想把它扔到空中,   但它成为每个IoC容器的核心功能   无论如何,如果没有它,温莎会看起来残废   是否真的需要它。

最后,我建议使用容器;它包装了内核,是管理应用程序的官方入口点(例如内核上没有Install方法)