Panther-JS — это фреймворк NodeJS со встроенным расширенным механизмом внедрения зависимостей, чтобы писать более управляемый код и упростить модульное тестирование.
Зачем нужна инъекция зависимостей?
- Написание операторов Require по всему коду может привести к неуправляемому коду, когда речь идет о крупномасштабных проектах.
- Трудно получить представление о коде, так как все инъекции зависимостей разбросаны по каждому файлу. Следовательно, снижается читабельность кода.
- Чтобы правильно провести модульное тестирование, вы должны изолировать части кода, удаляя зависимости. Это также может быть беспокойным, если за ним не ухаживают должным образом.
- Если вы хотите иметь несколько слоев кода, вам придется нелегко, поскольку require может без проблем получить доступ в любом месте.
- Большинство путей в операторах require могут быть очень уродливыми, например (…/…./ ../config.js), когда вам нужно перемещаться по родительским каталогам.
- Если в любом случае программисту необходимо изменить структуру папок кода, снова придется трогать и изменять каждый файл, чтобы сохранить зависимости.
Начиная
Сначала вам нужно скачать фреймворк, собрать все модули NPM и придумать работающий проект. Изначально каркас делится на 3 основных слоя. (вы можете добавить любое количество слоев или удалить существующие)
- Основной слой
- Общий слой
- Уровень доступа к БД
Каждый из вышеперечисленных слоев имеет свой собственный файл конфигурации зависимостей Json в config/dependancies.
В app.js каждая из вышеупомянутых конфигураций зависимостей требуется и внедряется как эта. Если вы добавляете свой собственный файл конфигурации, вы должны добавить его сюда таким же образом. Если вы удаляете файл конфигурации, вы также должны отключить его отсюда.
var dependancyManager=require('./app/middlewares/dependancy-manager');
var commonDependancies=require('./config/dependancies/common-dependancies'); var dbAccessDependancies=require('./config/dependancies/db-access-dependancies') var coreDependancies=require('./config/dependancies/core-dependancies');
dependancyManager.injectDependancies(commonDependancies); dependancyManager.injectDependancies(dbAccessDependancies); dependancyManager.injectDependancies(coreDependancies);
Как определить зависимость
Как определить зависимость
Каждый объект конфигурации зависимостей может иметь до 5 полей.
- name: указывает имя зависимости. Используемая здесь строка будет считаться ссылкой на зависимость.
- Абсолютный путь: это абсолютный путь к файлу зависимостей, учитывая, что app.js является корнем.
{
"name":"userAuthentication",
"absolutePath":"./app/core/user-manager/models/user-authentication",
},
- зависимости: это массив имен зависимостей, которые должны быть внедрены в этот модуль. Эта зависимость должна быть введена до модуля, в который она будет введена.
{
"name":"userSchema",
"absolutePath":"./app/db-access/schemas/user-schema",
},
{
"name":"userManagerInterface",
"absolutePath":"./app/db-access/interfaces/user-manager-interface",
"dependancies":["userSchema"]
},
Как написать модуль Panther
При написании модуля пантеры вы должны позаботиться о следующих пунктах:
Module.exports должна быть функцией с количеством параметров, указанным в конфигурации зависимостей. В противном случае вы получите сообщение об ошибке, в котором говорится, что номер аргумента не совпадает.
- Зависимости будут внедрены в том же порядке, как указано в файле конфигурации.
module.exports=function(utils,userInfoService){ // you can access injected modules var userInfoObj = userInfoService; var configReader=utils.configReader; // your code goes here var add=funtion(a,b){ return a+b; } var x =10;
return{ //these return objects will be injected to other modules which are dependant on this one x , add } };
**Примечание:- ** Модули Node доступны для доступа из операторов require, поскольку пути не указаны. Однако, в зависимости от вашей архитектуры, к модулям узла также можно получить доступ с помощью зависимостей panther.
var passport = require('passport');
Как написать маршрут XpressJS как модуль Panther
Модуль маршрута должен быть таким же, как и обычный модуль пантеры, и должен быть возвращен объект маршрута.
module.exports=function(userBusiness,utils){ var express = require('express'); var passport = require('passport');
var router = express.Router(); //POST : /user router.post('/user', function (req, res) { //your code });
//POST:/users/login router.post('/users/login', passport.authenticate('local',{session: false}),function(req, res) { //your code });
return router;
}
Дополнительное поле route должно быть добавлено в объект конфигурации зависимостей маршрута в качестве базового маршрута. Он будет автоматически введен как xpress-маршрут приложения.
{
"name":"user",
"absolutePath":"./app/core/user-manager/controllers/user",
"route":"/core/user-manager/user",
"dependancies":["userBusiness","utils"]
}
Пространства имен Пантеры
Panther предоставляет пространства имен в качестве специальной функции. Пространство имен panther может содержать несколько зависимостей в одном модуле. Используя эти пространства имен, код может быть многоуровневым. Например, все модули на уровне доступа к базе данных могут быть распределены как «dbAccessNamespace». Затем его можно внедрить в модули бизнес-уровня в виде набора модулей из уровня доступа к базе данных.
Пространства имен Panther должны следовать приведенным ниже соглашениям.
- У него не должно быть поля абсолютного пути
- Вам просто нужно определить его в объекте конфигурации
- Поле namespace должно быть равно true.
[
{
"name":"configReader",
"absolutePath":"./app/utils/common/config-reader"
},
{
"name":"errorResponseHandler" ,
"absolutePath":"./app/utils/common/error-response-handler.js"
},
{
"name":"utils",
"namespace":true,
"dependancies":["configReader","errorResponseHandler"]
}
]
вы можете напрямую перейти к моему пространству github, чтобы начать работу,
Наслаждаться…!!!