Внедрение зависимостей в функции с помощью awilix

#node.js #express #dependency-injection #awilix

#node.js #выражать #внедрение зависимостей #авиликс

Вопрос:

Я следил за структурой на основе компонентов для своих проектов, и я клонировал репозиторий для этой цели, указанный здесь

Все в порядке и поддается проверке, кроме сервисов.

Поэтому я решил использовать awilix для внедрения зависимостей в сервисы.

Это то, что я пробовал.

Я создал container.js файл в loaders .

 const awilix = require('awilix');

const db = require('../db');
const AuthService = require('../components/auth/auth.service');

const container = awilix.createContainer({
  injectionMode: awilix.InjectionMode.PROXY,
});

function setup() {
  container.register({
    db: awilix.asValue(db),
    doGetAllService: awilix.asValue(AuthService.doRegister),
  });
}

module.exports = {
  container,
  setup,
};
 

Я вызвал этот контейнер, app.js как показано ниже.

 const express = require('express');

const app = express();

const cors = require('cors');

// load environment config variables
require('dotenv').config();
require('./loaders/container').setup();
...
 

В документе говорится, что первым аргументом будут введенные зависимости. Но когда я это делаю console.log , я все равно получаю неопределенность.

 const doRegister = async (opts, { username, password }) => {
  console.log(opts);
  const user = await User.create({
    username,
    password,
    role_id: 1, // assign role id here
  });
   return user;
};
 

Для получения полной структуры папок и исходного кода, пожалуйста, просмотрите репозиторий.

Комментарии:

1. В вашем репозитории я не вижу никаких ссылок на awilix и не вижу, как вы регистрируете awilix cradle на свой http-сервер (например, awilix-express). Без этого вы никогда ничего не получите. Было ли это вашим намерением опубликовать этот вопрос? В любом случае я надеюсь, что мой ответ ниже поможет вам решить вашу проблему.

Ответ №1:

Чтобы awilix разрешить какие-либо зависимости, что-то должно потребляться из контейнера зависимостей или загружаться из него. Один способ container.resolve(...); (не постоянный), а другой — привязка базы данных к конвейеру запросов.

Например awilix-express , можно привязать cradle к таким запросам, как scopePerRequest(container) :

Добавьте это в промежуточное программное обеспечение вашего сервера

app.use(scopePerRequest(контейнер));

В случае, если вам нужен полный исходный код, вы можете проверить этот репозиторий: https://github.com/fdm-monster/fdm-monster/blob/fb0fc8075cfcd840ae7b50519fe6dd1525b03034/server/app-core.js#L63

Я рекомендую вам ознакомиться с awilix-express полной настройкой сервера с контроллерами, поскольку это действительно чище, чем просто маршруты API на основе функций: https://www.npmjs.com/package/awilix-express