依赖注入作为语言特征?

时间:2009-10-03 06:09:23

标签: dependency-injection inversion-of-control

是否有任何现有的编程语言明确地将依赖注入作为语言特性,如果是这样,是否有任何关于这些编程语言如何使用其语法将程序依赖性与其具体实现分离的示例?

(请注意:我不是在寻找DI / IOC框架 - 我实际上正在寻找一种实际上已在该语言中内置此功能的编程语言。)

4 个答案:

答案 0 :(得分:11)

您不会将依赖注入视为语言功能,因为它通常被视为设计模式。设计模式作为缺少语言功能的变通方法出现 - 例如,如果您将第一类类型作为语言功能,则不需要工厂模式(请参阅Norvig's presentation的第12页),如果您有多种方法作为语言功能您不需要双重调度模式。

DI是设计模式的语言功能是“参数模块”。请参阅与{Gilad Bracha的语言discussion of modules

相关的Newspeak vs DI

答案 1 :(得分:4)

我不是说听起来像一个混蛋,但每个OO语言都支持依赖注入。不需要特殊语法。只需使用它们的依赖项构造对象(或稍后设置它们的依赖项)。

您实际上可以将所有依赖项连接到程序顶部附近 - 不一定是main(),而是靠近顶部。

答案 2 :(得分:3)

Noop据说可以做到这一点,但我还没有看到语言规范(在我找到它之前我的耐心已经用完了。)

答案 3 :(得分:2)

可以说Scala在特征和自我类型注释的帮助下支持开箱即用的依赖注入。看看蛋糕模式:

http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/

基本上,这种方法使用具有声明的依赖关系的traits(通过使用自我类型)让编译器完成将它们连接在一起的工作。

这是声明注册表:

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 {
    ... 
  }
}