【问题标题】:Ruby dependency injection librariesRuby 依赖注入库
【发布时间】:2010-09-21 23:01:24
【问题描述】:

我一直在研究一些 Ruby 依赖注入库。特别是,我查看了NeedleCopland。它们已经存在了很长一段时间,但用途并不多。

使用这两个库有哪些优缺点?看起来很多库/框架确实可以很好地利用这两个库,例如Merb / Datamapper's Hook.

【问题讨论】:

    标签: ruby dependency-injection aop


    【解决方案1】:

    Jamis Buck,他写了 Copland 和 Needle,posted here 关于 Needle、依赖注入及其在 Ruby 世界中的用处。

    它很长但值得一读,但如果您想要与您的问题最相关的单个段落,我建议您从结尾开始:

    DI 框架是不必要的。在更多 刚性环境,它们有价值。 在像 Ruby 这样的敏捷环境中,不是 非常。模式本身可能 仍然适用,但要注意 落入想你的陷阱 一切都需要一个特殊的工具。 Ruby 是 Play-Doh,记住!让我们保持 就这样吧。

    HTH

    【讨论】:

    • 上周末我在 RubyConf 亲自看到了这个演讲,他做得非常出色。底线 - 您不需要在 Ruby 中进行依赖注入。
    • 这篇文章并不是说你不应该使用依赖注入,而是说你不需要 DI 框架。这是文章中的另一句话,“那么,Ruby 中没有 DI 的空间吗?肯定有。我在 Ruby 中几乎每天都使用 DI,但我不使用 DI 框架。Ruby 本身有足够的能力来代表任何一天您需要的 DI 习语。”
    • 只是想指出,DI Frameworks 在 Ruby 中是不必要的,但 DI 范式不应该被忽视。
    【解决方案2】:

    http://fabiokung.com/2010/05/06/ruby-and-dependency-injection-in-a-dynamic-world/:这是另一篇文章,比 James Buck 的文章要少得多。底线是您不需要依赖注入,因为 ruby​​ 提供了许多很好的替代方案,它们同样有效,但在 Java 世界中并不存在。

    其中一种选择是 mixins,这是 Java 所没有的,另一种是能够覆盖/重新定义语言中几乎任何东西的能力。其他功能包括动态类型,基本上您可以将任何消息发送到任何对象,并且如果它恰好为该消息提供了实现,那么一切都会正常工作。所有这些东西一起工作,消除了对 DI 框架的大部分需求。这样的设计模式在 Ruby 中仍然有效,有时使用它才有意义。

    上面 Alexey Petrushin 还提出的关于 DI 的另一点是,依赖注入主要是一种设计模式,工具是次要的,主要是为了摆脱 Java 中某些东西的乏味。在 ruby​​ 中,您可以轻松地模拟 spring 或 guice 在 Java 中为您所做的大部分工作。所以一个成熟的依赖注入框架在 Ruby 中本质上是多余的。

    话虽如此,有时拥有一个 DI 框架还是不错的,因为它最终可以消除一些繁琐的接线工作。我不能保证任何 Ruby 特定的 DI 框架,但我知道很多 Ruby 项目最终被另一种语言(甚至 Java)重写,因为事物的游戏性质导致事情变得难以维护/扩展。我怀疑这与开发人员使用各种强大的语言功能自欺欺人有很大关系。拥有一个 DI 框架强加了一些可能有助于防止这种情况的结构和习语。

    【讨论】:

    • 同意,尤其是最后一段!
    【解决方案3】:

    这是另一个 IoC http://alexeypetrushin.github.com/micon

    我将它用作我的 Web 框架(不是 Rails)的核心组件,您可以在此处看到它的工作原理 - http://ruby-lang.info(此站点由它提供支持)。 它为我节省了大量时间和代码,所以我个人认为 IoC 非常有用(在某些情况下)。

    DI 框架是不必要的。在更严格的环境中,它们具有价值。在像 Ruby 这样的敏捷环境中,没有那么多。模式本身可能仍然适用,但要小心不要陷入认为你需要一个特殊工具来处理所有事情的陷阱。 Ruby 是 Play-Doh,记住!让我们保持这种状态。

    我看了 Jamis Buck 的谈话,我同意和不同意他的观点,这就是为什么http://ruby-lang.info/blog/you-underestimate-the-power-of-ioc-3fh

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 2021-09-11
      • 1970-01-01
      • 2017-11-20
      相关资源
      最近更新 更多