Внедрить зависимости в модуль ES2015

Можно ли внедрять зависимости в модули ES2015, как в других языках программирования, таких как C# или Java? Если я импортирую модуль, я создаю для него жесткую зависимость и не могу изменить ее позже во время выполнения. Например, у меня есть следующий код JavaScript:

import Animal from './dog';

class Person {
  feedAnimal() {
    new Animal().feed();
  }
}

Я импортирую модуль собаки. Но что, если я хочу изменить его на кошку? На данный момент мне нужно изменить строку 1 вручную, но в некоторых ситуациях я хочу, чтобы она настраивалась извне, чтобы при некоторых условиях это был кот, а при некоторых других условиях это должен был быть кот. Все то, что можно сделать с помощью классической инъекции зависимостей.

Я знаю, что существуют некоторые фреймворки DI, такие как Scatter, Electrolyte, Wire и так далее, но к сожалению, большинство из них требуют особого синтаксиса и не предназначены для модулей ES2015.


person LongFlick    schedule 14.08.2015    source источник
comment
Как бы вы хотели, чтобы работала инъекция зависимостей? Вы могли бы сделать class Person { constructor(Animal) { this.Animal = Animal; } feedAnimal() { new this.Animal().feed() } }, но похоже, что вы ожидаете чего-то более продвинутого.   -  person lyschoening    schedule 14.08.2015
comment
Я не уверен, что require-inject поддерживает это, но вы можете взглянуть.   -  person thefourtheye    schedule 14.08.2015
comment
@lyschoening спасибо, но я хочу изменить внутренние зависимости модуля, как если бы я написал модульный тест.   -  person LongFlick    schedule 14.08.2015
comment
@thefourtheye спасибо, но дело в том, что я ничего не требую. Требование — это вещь, связанная с CommonJS. Я использую блестящую новую функцию импорта ES2015.   -  person LongFlick    schedule 14.08.2015
comment
Вероятно, вы могли бы так или иначе взломать загрузчик модулей. Не то, чтобы я рекомендовал это делать.   -  person Felix Kling    schedule 14.08.2015


Ответы (3)


Вы не можете динамически определять зависимости. см. этот вопрос и его принятый ответ:

Вопрос: имя импортируемой переменной ES6 в node.js?

Ответ: Не с оператором импорта. импорт и экспорт определены таким образом, что их можно анализировать статически, поэтому они не могут зависеть от информации времени выполнения.

person sdgluck    schedule 17.08.2015
comment
Хмм хорошо. Очень жаль. Знаете ли вы какое-либо обходное решение или что-то в этом роде? - person LongFlick; 18.08.2015
comment
Загрузчик модулей, такой как SystemJS, позволит вам сделать то, что вы хотите. - person sdgluck; 18.08.2015
comment
Я спрашиваю себя, как выполнять все модульные тесты записи, если я не могу смоделировать какие-либо зависимости в моем модуле для тестирования? - person LongFlick; 18.08.2015
comment
Имитация зависимости означает замену или изменение фактической зависимости без воздействия на код, который ее использует, а также не изменение кода, использующего зависимость, для использования другой зависимости. Я надеюсь, что это имеет смысл, пожалуйста, спросите, если вам нужны разъяснения. - person sdgluck; 19.08.2015
comment
Я знаю это. Из-за этого я создал вопрос выше ;-) - person LongFlick; 20.08.2015
comment
@sdgluck: я думаю, что OP запрашивает именно такую ​​зависимость - внедрение извне, для которой не нужны динамические/переменные имена импорта. Ему просто нужно имя фиктивного модуля resolver. - person Bergi; 09.09.2015

Для этого вы можете использовать inject-loader, если вы связываетесь с Webpack.

Надеюсь, это поможет кому-то, кто наткнется на этот старый пост.

person user8605837    schedule 13.09.2017

Я перешел на SystemJS. С SystemJS вы можете делать динамический импорт, например System.import('foo').then(() => console.log('Loaded));

Еще одним преимуществом является то, что System будет новой стандартной системой загрузки модулей ECMAScript.

person LongFlick    schedule 09.09.2015