2015-05-22 2 views
1

Я обычно создаю мой JavaScript "контроллеры" следующим образом:Dependency Injection в откровенном модуле

var module = (function(){ 

    function init(someService){ 
     someService.doSomething(); 
    } 

    return { 
     init: init 
    }; 

})(); 
module.init(SomeService); 

Я просто наткнулся на injetion зависимостей в JavaScript (например, JavaScript Dependency Injection).

То, что я хотел бы знать, с точки тестирования зрения, есть какие-либо преимущества использования Injector в моей ссылке, чтобы придать издевается и такое, по сравнению с простым пропусканием их сделать функцию init, как я выше.

Чтобы разработать, я мог бы просто передать SomeService макет, когда я инициализирую свои тесты сегодня. Итак, есть ли смысл использовать Injector или что-то подобное?

ответ

4

Вы уже выполняете инъекцию зависимостей. Вместо инициализации someService в модуле вы передаете его в метод init. Это именно то, что касается Инъекции Зависимости!

Одним из таких преимуществ является простота тестирования, так как вы можете просто наброситься на someService (как вы уже сказали).

Использование контейнера для инъекций/зависимостей - это управление всеми этими зависимостями. Представьте, что у вас больше модулей, все из которых имеют свои зависимости. Скоро станет кошмаром для управления инициализацией всех этих классов.

Это та часть, в которой находится контейнер, и снова вызывает радость.

Чтобы ответить на ваш вопрос, если это все, что у вас есть, нет необходимости в инжекторе/контейнере.


// the Module object 
var Module = function (someService) { 
    this.someService = someService; 
}; 
Module.prototype.do = function() { 
    this.someService.doSomething(); 
}; 

// configuring the injector 
Injector.add('someService', new SomeService()); 

// retrieving the module instance with the SomeService being injected 
var module = Injector.get(Module); 

module.do(); 

Другие примеры можно увидеть на http://www.yusufaytas.com/dependency-injection-in-javascript/

+0

Я согласен с Wouter J, вы уже делаете инъекции зависимостей. Я думаю, что проблема, о которой вы говорите, больше связана с тем, как/какие файлы вы загружаете. Если у вас есть загрузчик модуля (например, requirejs, browserify или webpack ...), вы можете закрепить некоторые модули в тестовом режиме, чтобы они были заменены. Если у вас нет загрузчика модуля, вы можете просто переключить теги скриптов, которые вы добавляете в тестовом режиме. – topheman

+0

Спасибо за разъяснение! Это, очевидно, просто фиктивный пример. Не могли бы вы показать мне, как использовать Инжектор в моем примере? – filur

+1

@filur добавил пример –