还有哪些其他IoC容器具有类似IInitializable的功能?

时间:2009-04-20 15:46:49

标签: dependency-injection inversion-of-control ioc-container object-lifetime

我在之前的项目中一直使用Castle Windsor,我非常喜欢它。对于我目前的项目,我希望使用不同的IoC容器。 Castle Windsor自2007年以来没有任何新版本,但仍未达到版本1.0,因此很难证明在商业环境中使用它是正确的。

我喜欢Castle Windsor的一个方面是,只需通过制作服务器IInitializable,您就可以在设置了所有依赖项后,在容器上调用Initialize方法。我经常使用它。它可以很容易地进行属性注入而不是构造函数注入,并且可以清理代码和测试。

我一直在寻找StructureMap,AutoFac,Unity和Spring.Net作为替代方案,但只有Spring.Net支持类似的东西,它会自动调用Init()方法。不幸的是,Spring.Net并不真正支持我想要使用IoC容器的方式(它注入基于字符串键而不是接口声明,因此它的自动装配支持也是有限的)

我是否错过了我看过的IoC容器中的类似功能?我以某种方式处理IoC容器的方式是错误的吗?或者是否有其他IoC容器支持IInitializable或Init()?

4 个答案:

答案 0 :(得分:4)

Autofac可以做到 - 他们称之为Startable

答案 1 :(得分:2)

使用StructureMap,您可以执行以下操作:

ForRequestedType<IFoo>()
  .TheDefaultIsConcreteType<Foo>()
  .OnCreation(x => x.Init());

这并不像在课堂上实现“初始化”界面那么容易,但这也意味着你不需要通过继承DI容器特定的界面将你的类实现绑定到你选择的DI容器上(虽然我'我不确定现实中存在多少问题。

我认为构造函数注入现在更常用,并且属性注入被广泛视为无法让DI容器为您执行对象构造(例如ASP.NET webforms)的情况下的后备。我可能在那里错了,这只是我对这个主题的看法!

你真的认为注入属性“可以清理代码并进行相当多的测试”吗?这很有趣,因为我认为相反 - 我认为构造函数注入'更干净',我猜这可能只是因为我通常这样做,所以这就是我习惯的。 :)

答案 2 :(得分:2)

Castle可能在一段时间内没有任何释放,但它仍然在积极开发。您可以获得最新(非常稳定)的构建here

很快就会有正式的v2.0发布。如果你知道它很好,为什么不使用你已经知道的东西呢?

答案 3 :(得分:2)

LinFu.IOC拥有它 - 它被称为IInitialize。你可以在这里找到它:github.com/philiplaureano/LinFu