“温莎城堡”和“集装箱”有什么区别?和“;Kernel"

本文关键字:集装箱 Kernel quot 区别 城堡 什么 温莎城堡 | 更新日期: 2023-09-27 18:18:09

我开始使用Windsor,我想知道什么时候应该使用container,什么时候应该使用kernel。例如

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>();

老实说我不太理解在容器和容器之间是否有差异内核和""术语。在我的脑海中,这听起来像是同一事物在不同的IoC库中的两个名称。

注:我读了这篇文章,但仍然不能理解为什么要在这里留下一个功能的两个实现?

更新:在我的代码中发现这样的行

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

为什么要通过Kernel?

“温莎城堡”和“集装箱”有什么区别?和“;Kernel"

它们在今天基本上是等价的,但最初IKernel和IWindsorContainer生活在不同的程序集中,Windsor容器包装内核。两者在某个时候被合并,但保持有效,以确保可能使用过其中一个或另一个的用户的向后兼容性。

由于合并发生在2.5版本(如链接文章中所述),因此可以合理地假设有一些不可忽略的用户可能在一个或另一个接口上工作,因此您现在看到的cruft。

查看代码,您可以看到几乎所有来自windsor容器的代码都在内部调用内核,并为子容器功能添加了一些行为,这是过去遗留下来的另一个选项,不一定有用

对于那些认为我真的要取消对嵌套的支持的人集装箱放心,这不会发生。我仍然认为这可能是一个可行的选择,我想把它扔到空中,但它已成为每个IoC容器的核心功能不管怎样,如果Wind-sor没有它的话,它会看起来残废的不管是否真的需要。

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