14

我遇到了 google guice,并不能真正理解它以及它的作用,尽管它周围似乎有很多炒作。我希望从 clojurian 角度了解该库,以及为什么在 clojure 应用程序中需要/不需要它,以及该语言中是否内置了类似的东西。

4

2 回答 2

14

由于 Java 的 OO 和类型系统,不同底层实现之间的动态切换(例如用于测试(模拟)目的)可能难以管理。像 Google Guice 这样的库旨在更优雅地处理 Java 中的这些依赖注入

在 Clojure 和其他函数式语言中,可以传递函数,这使得使用不同的实现变得更加容易。

在 Clojure 中有几种方法可以做到这一点:

  • 使用您选择的函数作为高阶函数的参数。
  • (重新)将您选择的函数绑定到 var。
  • 将您选择的函数封装在闭包中,然后可以传递和调用。

Clojure Programming的第 12 章有一些很好的 OO 模式示例,例如依赖注入以及在 Clojure 中处理这些模式的替代方法。

Sean Devlin 还有一个关于 Clojure 依赖注入的完整 Disclojure 视频。不过,他的榜样可能被选得更好。他没有在他的闭包中使用完全不同的函数实现,而是使用了一个返回不同“版本”函数的工厂。要点保持不变。

基本上,依赖注入是 OOP 中必不可少的一种模式,并且可以在 FP 中轻松解决(甚至不是问题)。

于 2012-10-26T11:43:43.117 回答
6

粗略的 Clojure 等价物仍在开发中。目前有两个库正在开发中(截至 2012 年 10 月):Prismatic 的Graph(尚未开源)和Stuart Sierra 的Flow

请注意,我认为 Guice 不仅仅是依赖注入。它为应用程序配置/模块化提供了一个框架。上述库旨在实现这一目标。

于 2012-10-26T12:53:49.020 回答