ES6 Dependency Injection container
- Implement DI principles
- Testability
- Customization by configuration file
##Dependency Annotation
Similar to AngularJs 1.x you must to annotate your ES6 classes with $inject property that container knows what types to inject into constructor.
class Provider {
constructor(connectionString, logger) {
this.connectionString = connectionString;
this.logger = logger;
}
getData() {
}
}
Provider.$inject = ['connectionString', 'logger'];
To define your types in container you have to use 'registerType' method. Method tells the container instantiate object that requires by concrete injection. To map types container uses string aliases.
Example:
import IoC from ‘ioc.js’
const ioc = new IoC();
ioc.registerType('connectionString', 'http://api.com');
ioc.registerType('logger', Logger);
ioc.registerType('provider', Provider);
To instatiate concrete object and it's dependencies you have to use 'resolve' method.
let logic = ioc.resolve('logic');
Note that object do not instantiated directly, rather you just say: "Hey, ioc give me the 'logic'". And container first construct object dependencies and then passes them to required object constructor.
- Реализация принципов DI
- Повышение тестируемости кода
- Возможность конфигурирования приложения
Также как в AngularJs 1.x вам нужно определить статическое свойство $inject. Это позволить IoC контейнеру определить какие зависимости требует ваш класс.
class Provider {
constructor(connectionString, logger) {
this.connectionString = connectionString;
this.logger = logger;
}
getData() {
}
}
Provider.$inject = ['connectionString', 'logger'];
Первым делом необходиму указать контейнеру соотвествие имени зависимости и класса реализации.
Пример:
import IoC from ‘ioc.js’
const ioc = new IoC();
ioc.registerType('logger', Logger);
Для создания конкретного объекта необходимо вызвать метод resolve
let logic = ioc.resolve('logic');
Обратите внимание, что явного создания зависимостей не происходит. Вы просто говорите контейнеру: "Создай мне зависимость logic". При этом сначала будут созданы все зависимости, а затем сам запрашиваемый объект.