- PVSM.RU - https://www.pvsm.ru -
Прочитав несколько статей на тему DI мне захотелось использовать его в Node.js; после недолгих поисков оказалось, что модулей для этого не так много, из них самый интересный — di.js [1] от Angular, но он мне не подошел и я решил написать свой.
Самой интересной в написании модуля оказалась задача динамической передачи в конструктор аргументов.
Наиболее очевидное решение — использовать apply, но это не сработает, так как он взаимодействует с методами, а не конструкторами.
Для нашей цели можно воспользоваться spread operator [2]:
class Test {
constructor(a, b) {
}
}
let args = [1, 2]
let test = new Test(...args)
В остальном реализация довольно скучна и не содержит ничего интересного.
Я решил отказаться от декораторов di.js в пользу конфиг-файла. Допустим, мы описываем архитектуру компьютера, тогда в конфиге нам нужно описать наши классы, пути к ним и их аргументы:
{
"Computer": {
"class": "./Computer.js", // Путь к классу
"args": ["RAM", "HDD", "CPU", "GPU"] // Зависимости
},
"RAM": {
"class": "./RAM.js",
"args": []
},
"HDD": {
"class": "./HDD.js",
"args": []
},
"CPU": {
"class": "./CPU.js",
"args": ["RAM"]
},
"GPU": {
"class": "./GPU.js",
"args": []
}
}
Класс Computer, как и все остальные, довольно простой:
'use strict'
class Computer {
constructor(ram, hdd, cpu, gpu) {
this._cpu = cpu
this._gpu = gpu
this._hdd = hdd
this._ram = ram
}
}
module.exports = Computer
Теперь в точке входа нашего приложения используем модуль:
const Injector = require('razr')(__dirname, './path/to/your/config.json') // передаем текущий путь и путь к конфигу
const computer = Injector.get('Computer') // тут мы молучим инстанс Computer
Стоит заметить, что в конфиг-файле нужно указывать пути к классам относительно точки входа приложения.
На этом все. Спасибо всем, кто дочитал. А вот ссылочка на GitHub — https://github.com/Naltox/razr [3] и NPM — http://npmjs.com/package/razr [4]
Автор: Altox
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/161001
Ссылки в тексте:
[1] di.js: https://github.com/angular/di.js/
[2] spread operator: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/Spread_operator
[3] https://github.com/Naltox/razr: https://github.com/Naltox/razr
[4] http://npmjs.com/package/razr: http://npmjs.com/package/razr
[5] Источник: https://habrahabr.ru/post/306276/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.