Подтвердить что ты не робот

Инъекция зависимостей как функция языка?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Noop якобы делает это, но я не видел спецификации языка (мое терпение закончилось до того, как я его нашел).

Ответ 4

Можно сказать, что 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 {
    ... 
  }
}