Внедрение зависимостей как особенность языка? - PullRequest
19 голосов
/ 03 октября 2009

Существуют ли какие-либо современные языки программирования, для которых явное внедрение зависимостей является языковой функцией, и если да, то есть ли примеры того, как такие языки программирования используют свой синтаксис для отделения программных зависимостей от конкретных реализаций?

(Обратите внимание: я не ищу фреймворк DI / IOC - я на самом деле ищу язык программирования, который фактически имеет эту функцию, встроенную в язык).

Ответы [ 4 ]

11 голосов
/ 03 октября 2009

Вы не найдете внедрение зависимостей как функцию языка, так как это обычно рассматривается как шаблон проектирования. Шаблоны проектирования возникают как обходные пути для отсутствующих языковых функций - например, если у вас в качестве языковой функции есть классы первого класса, вам не нужен фабричный шаблон (см. Стр. 12 в представление Norvig ), если у вас есть несколько методов в качестве языковой функции вам не нужен шаблон двойной отправки.

Функцией языка, для которой DI является шаблоном проектирования, являются «параметрические модули». См. обсуждение модулей против DI, относящихся к языку Гилада Брачи Newspeak

4 голосов
/ 03 октября 2009

Я не хочу звучать как придурок, но каждый язык ОО поддерживает внедрение зависимостей. Никакого специального синтаксиса не требуется. Просто создайте свой объект с их зависимостями (или установите их зависимости позже).

Вы можете подключить все свои зависимости где-нибудь в верхней части программы - не обязательно main(), но близко к вершине.

3 голосов
/ 03 октября 2009

Нет предположительно делает это, но я не видел спецификацию языка (у меня кончилось терпение, прежде чем я ее нашел).

2 голосов
/ 13 мая 2014

Можно сказать, что Scala поддерживает внедрение зависимостей из коробки с помощью черт и аннотаций самостоятельного типа. Посмотрите на Торт Выкройки:

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

В основном, этот подход использует черты с объявленными зависимостями (используя self-типы), чтобы позволить компилятору выполнить их соединение.

Это реестр деклараций:

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 {
    ... 
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...