Каков наилучший способ передачи общих переменных в отдельные модули в узле.Джей?
Я использую отдельные файлы маршрутизатора в качестве модулей для основного приложения и приложения двиг. Я не могу получить лучший способ передачи переменных(клиентская БД) в маршрутизаторах. Я не хочу его жестко кодировать или передавать с помощью:
module.exports = function(app, db) {
может быть, это лучший способ использовать одноэлементный регистр или использовать глобальную переменную db?
каков ваш опыт работы с дизайн-моделей? Какой путь является лучшим и почему?
4 ответа:
Я нашел с помощью инъекции зависимости, чтобы передать вещи, чтобы быть лучшим стилем. Это действительно будет выглядеть примерно так, как у вас:
// App.js module.exports = function App() { }; // Database.js module.exports = function Database(configuration) { }; // Routes.js module.exports = function Routes(app, database) { }; // server.js: composition root var App = require("./App"); var Database = require("./Database"); var Routes = require("./Routes"); var dbConfig = require("./dbconfig.json"); var app = new App(); var database = new Database(dbConfig); var routes = new Routes(app, database); // Use routes.
это имеет ряд преимуществ:
- это заставляет вас разделить вашу систему на компоненты с четкими зависимостями, вместо того, чтобы скрывать зависимости где-то в середине файла, где они вызывают
require("databaseSingleton")
или еще хуже,global.database
.- это делает модульное тестирование очень легко: если я хочу проверить
Routes
в изоляции, я могу ввести его с поддельнымиapp
иdatabase
params и проверить только код.- он помещает все ваши объектно-графовые проводки вместе в одном месте, а именно корень композиции (который в данном случае
server.js
приложения точка входа). Это дает вам одно место, чтобы посмотреть, как все сочетается в системе.одно из лучших объяснений этого, что я видел это интервью с Марком Симаном, автор отличной книги инъекция зависимостей в .NET. это относится так же, как и к JavaScript, и особенно к узлу.js:
require
часто используется в качестве классического сервисного локатора, а не просто модульной системы.
Я предлагаю вам создать файл настроек с экземпляром БД и с другими вещами, которые вам нужно использовать глобально, как "синглтон".
например, у меня есть настройки.js с моим клиентом redis db:
var redis = require('redis'); exports.redis = redis.createClient(6379, '127.0.0.1');
и в других нескольких модулях я включаю его:
var settings = require('./settings'); setting.redis.<...>
много раз, включая его, у меня всегда есть один экземпляр подключения к БД.
вы можете сохранить себе весь шаблонный код подключения модулей, если вы использовать фреймворк внедрения зависимостей
ответ перечислены некоторые из них. Я также построил проще DI рамки здесь.
EDIT: ниже находится копия формы ответа в случае, если эта страница изменяется
require
и the способ управления зависимостями в узел.js и, конечно, это интуитивно и эффективно, но он также имеет свои ограничения.мой совет-взглянуть на некоторые из контейнеров инъекций зависимостей, доступных сегодня для Node.JS, чтобы иметь представление о том, каковы их плюсы/минусы. Некоторые из них:
просто чтобы назвать a несколько.
Теперь вопрос в том, что вы можете достичь с узлом.JS DI контейнер, по сравнению с простым
require
?плюсы:
- лучшая тестируемость: модули принимают свои зависимости в качестве входных данных
- инверсия управления: решите, как подключить ваши модули, не касаясь основного кода вашего приложения.
- настраиваемый алгоритм разрешения модулей: зависимости имеют" виртуальные " идентификаторы, обычно они не привязаны к пути в файловой системе.
- Лучшая расширяемость: включена IoC и" виртуальными " идентификаторами.
- другие необычные вещи можно:
- асинхронной инициализации
- Управление жизненным циклом модуля
- расширяемость самого контейнера DI
- можно легко реализовать абстракции более высокого уровня (например, АОП)
плюсы:
- отличается от узла.ОАО "опыт": не используя
require
определенно чувствует, что вы отклоняетесь от узлового образа мышления.- связь между зависимостью и ее реализацией не всегда является явной. Зависимость может быть решена во время выполнения и зависит от различных параметров. Код становится более трудным для понимания и отладки
- медленнее время запуска
- зрелость (на данный момент): ни одно из текущих решений не является действительно популярные на данный момент, так что не так много учебников, нет экосистемы, не бой испытан.
- некоторые контейнеры DI не будут хорошо работать с модулями, такими как Browserify и Webpack.