【发布时间】:2016-04-15 05:37:11
【问题描述】:
是否有任何现有的现代编程语言明确将依赖注入作为语言功能,如果有,是否有任何示例说明此类编程语言如何使用其语法将程序依赖项与其具体实现分开?
(请注意:我不是在寻找一个 DI/IOC 框架——我实际上是在寻找一种在语言中内置了这个功能的编程语言)。
【问题讨论】:
标签: dependency-injection inversion-of-control
是否有任何现有的现代编程语言明确将依赖注入作为语言功能,如果有,是否有任何示例说明此类编程语言如何使用其语法将程序依赖项与其具体实现分开?
(请注意:我不是在寻找一个 DI/IOC 框架——我实际上是在寻找一种在语言中内置了这个功能的编程语言)。
【问题讨论】:
标签: dependency-injection inversion-of-control
您不会发现依赖注入是一种语言功能,因为它通常被视为一种设计模式。设计模式是作为缺少语言功能的解决方法出现的——例如,如果您将一流的类型作为语言功能,则不需要工厂模式(请参阅Norvig's presentation 的第 12 页),如果您将多方法作为语言功能,则不需要双重调度模式。
以 DI 为设计模式的语言特性是“参数模块”。请参阅与 Gilad Bracha 的语言有关的 discussion of modules 与 DI Newspeak
【讨论】:
我并不是说听起来像个混蛋,但每种 OO 语言都支持依赖注入。不需要特殊语法。只需使用它们的依赖项构建您的对象(或稍后设置它们的依赖项)。
实际上,您可以在程序顶部附近的某个位置连接所有依赖项 - 不一定是 main(),而是靠近顶部。
【讨论】:
Noop 应该是这样做的,但我还没有看到语言规范(在我找到它之前我的耐心已经耗尽)。
【讨论】:
可以说 Scala 在特性和自类型注释的帮助下支持开箱即用的依赖注入。看看蛋糕图案:
http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/
基本上,这种方法使用具有声明依赖关系的特征(通过使用自类型)让编译器完成将它们连接在一起的工作。
这是声明注册表:
object ComponentRegistry extends
UserServiceComponent with
UserRepositoryComponent
{
val userRepository = new UserRepository
val userService = new UserService
}
...注册用户存储库:
trait UserRepositoryComponent {
val userRepository: UserRepository
class UserRepository {
...
}
}
...以及依赖于存储库的用户服务组件:
trait UserServiceComponent {
this: UserRepositoryComponent =>
val userService: UserService
class UserService {
...
}
}
【讨论】: