【问题标题】:What other IoC containers have an IInitializable like feature?还有哪些其他 IoC 容器具有类似 IInitializable 的功能?
【发布时间】:2010-10-20 14:39:59
【问题描述】:

我在之前的项目中一直在使用 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 容器支持 IInitializable 或 Init() 之类的东西?

【问题讨论】:

  • Castle 鼓励您从主干构建自己的版本,这就是为什么有一段时间没有发布了
  • 另外,我从 Castle 切换到 Autofac 并且从未回头
  • Autofac 现在似乎是一个不错的选择。我一直在为自己的爱好项目从后备箱构建,因为这是获得流利注册内容的唯一方法。但对于专业工作,我想要一个经过良好测试的版本。
  • Autofac 的官方版本自 2007 年以来就具有流畅的语法 - 不知道您的意思:)
  • 关于 Spring 注入的评论:您可以在对象元素上添加一个 autowire="byType" 作为属性以按类型自动装配...

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


【解决方案1】:

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

【讨论】:

  • 谢谢,我会试试看,不知何故在文档中错过了它。 +1
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 谢谢。很好的答案。 +1 我从属性注入中获得的主要优势是,每当我向类添加依赖项时,我都不需要重写现有代码和测试。还将所有依赖项放在一个地方而不是将它们混合在构造函数中使我的代码更具可读性。但我可以想象这是一个品味问题:-)
【解决方案3】:

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

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

【讨论】:

  • 我自己仍然使用它,但许多商业设置非常困难。对于某些客户端来说,使用 OSS 库可能具有挑战性,使用从未有过官方 1.0 版本并且仍然仅作为候选版本 3 可用的 OSS 库更加困难,这就是我正在寻找替代方案的原因。感谢您告诉我即将发布的 2.0 版本,这可能会改变一些事情。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2011-05-06
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多