3

我在之前的项目中一直在使用 Castle Windsor,我非常喜欢它。对于我当前的项目,我希望使用不同的 IoC 容器。Castle Windsor 自 2007 年以来没有发布任何新版本,并且仍然没有 1.0 版,因此很难证明在商业环境中使用它是合理的。

我喜欢 Castle Windsor 的一件事是,在设置了所有依赖项之后,您可以让容器在您的服务上调用 Initialize 方法,只需让服务实现即可IInitializable。我经常使用这个。它使进行属性注入而不是构造函数注入变得容易,并且可以清理代码和进行相当多的测试。

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

我是否错过了我查看的 IoC 容器中的类似功能?我使用 IoC 容器的方式是否有问题?或者是否有其他 IoC 容器支持 IIinitializable 或 Init() 之类的东西?

4

4 回答 4

4

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

于 2009-04-20T16:10:01.213 回答
2

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

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

它不像在你的类上实现一个“初始化”接口那么容易,但这也意味着你不需要通过从一个 DI 容器特定接口继承来将你的类实现与你选择的 DI 容器联系起来(虽然我不确定现实中有多少问题)。

我相信构造函数注入现在更常用,并且属性注入被广泛视为无法让 DI 容器为您执行对象构造的情况(例如 ASP.NET 网络表单)的后备方案。不过我可能错了,这只是我对这个问题的看法!

你真的认为属性注入“清理代码和测试相当多”吗?这很有趣,因为我的想法正好相反——我认为构造函数注入更“干净”,我猜这可能仅仅是因为我通常这样做,所以这就是我习惯的方式。:)

于 2009-04-20T16:13:56.210 回答
2

LinFu.IOC 有它——它叫做 IInitialize。你可以在这里找到它:github.com/philiplaureano/LinFu

于 2011-03-17T06:20:45.750 回答
2

Castle 可能有一段时间没有发布任何版本,但它仍在积极开发中。你可以在这里获得最新的(相当稳定的)构建。

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

于 2009-04-21T13:01:55.523 回答