Разница между модуляризацией JavaScript и инъекцией зависимостей
В чем разница с модульностью кода javascript (с помощью browserify на примере) и внедрением зависимостей?
Это синонимы? Собираются ли два вместе? Или я что-то упустил?
2 ответа
Модуляризация означает разбиение кода на отдельные, независимые "пакеты".
Внедрение зависимостей относится к не жестким ссылкам на другие модули.
В качестве практического примера вы можете написать модули, которые не используют внедрение зависимостей:
import { Foo } from 'foo';
export function Bar() {
return Foo.baz();
}
Здесь у вас есть два модуля, но этот модуль импортирует определенный другой жестко закодированный модуль.
Тот же модуль написан с использованием внедрения зависимостей:
export function Bar(foo) {
return foo.baz();
}
Тогда кто-то другой может использовать это как:
import { Foo } from 'foo';
import { Bar } from 'bar';
Bar(Foo());
Вы вводите Foo
зависимость во время вызова, вместо жесткого кодирования зависимости.
Вы можете сослаться на эту статью:
Модули - это фрагменты кода, которые реализуют определенные функции и написаны с использованием определенных методов. В языке JavaScript нет готовой схемы модульности. Предстоящая спецификация ECMAScript 6 стремится решить эту проблему путем введения концепции модуля на самом языке JavaScript. Это будущее.
и внедрение зависимостей в JavaScript
Цель
Допустим, у нас есть два модуля. Первый - это сервис, который делает запросы Ajax, а второй - маршрутизатор.
var service = function() { return { name: 'Service' }; } var router = function() { return { name: 'Router' }; }
У нас есть другая функция, которая нуждается в этих модулях.
var doSomething = function(other) { var s = service(); var r = router(); };
И чтобы сделать вещи немного более интересными, функция должна принять еще один параметр. Конечно, мы могли бы использовать приведенный выше код, но он не очень гибкий. Что, если мы хотим использовать ServiceXML или ServiceJSON. Или что, если мы хотим макетировать некоторые модули для целей тестирования. Мы не можем просто отредактировать тело функции. Первое, что мы все придумали - это передать зависимости как параметры в функцию. То есть:
var doSomething = function(service, router, other) { var s = service(); var r = router(); };
Делая это, мы передаем точную реализацию модуля, который мы хотим. Однако это приносит новую проблему. Представьте, что мы делаем что-то во всем нашем коде. Что будет, если нам понадобится третья зависимость. Мы не можем редактировать все вызовы функции. Итак, нам нужен инструмент, который сделает это за нас. Вот что пытаются решить инжекторы зависимости. Запишем несколько целей, которых мы хотим достичь:
- мы должны быть в состоянии зарегистрировать зависимости
- инжектор должен принять функцию и вернуть функцию, которая каким-то образом получает необходимые ресурсы
- мы не должны много писать, нам нужен короткий и красивый синтаксис
- инжектор должен сохранять область переданной функции
- переданная функция должна иметь возможность принимать пользовательские аргументы, а не только описанные зависимости
Хороший список не так ли. Давайте погрузимся в.