Что такое луковая архитектура?

Onion Architecture - это структурный паттерн проекта, который позволяет нам поддерживать и тестировать код для корпоративных систем. Это позволяет нам иметь другой уровень для другого уровня, такого как Модель, DA, Сервис, Контроллер, Представление.

Преимущество:

  • Слабое соединение
  • Повышенная ремонтопригодность на другом уровне
  • Повышение тестируемости благодаря разделению проектов на слои
  • Модульная концепция

Слои:

  • Уровень DA: уровень DataAccess, который будет специально заниматься такими операциями базы данных, как чтение, вставка, обновление и удаление.
  • Уровень обслуживания: этот уровень будет содержать нашу бизнес-логику для каждого API.
  • Уровень контроллера: на этом уровне будут определены все маршруты и будут выполняться вызовы функции определенного уровня сервиса.
  • Типы: на этом уровне будут определены все типы и интерфейс.

Мы будем внедрять луковую архитектуру в Node.JS, используя подход к концепции ООП. Здесь мы будем использовать Typescript, поскольку он предоставляет гораздо больше возможностей для ООП.

Настройка базы данных:

Поскольку мы будем использовать базу данных MySQL, вы должны установить phpMyAdmin, а затем открыть

  • Создайте базу данных под названием onion.
  • Внутри onion создайте таблицу с именем student со следующим запросом

Настройка проекта:

Установите Typescript глобально в вашу систему с помощью этой команды

npm i -g typescript

Откройте командную строку, перейдите в каталог проекта и выполните tsc –init. Будет создан файл tsconfig.json, содержащий конфигурацию Typescript для этого проекта.

Поместите следующий код в tsconfig.json

Теперь выполните npm init и давайте установим пару пакетов.

npm i dotenv express mysql shorttid

npm i -D @ types / express @ types / mysql @ types / short typescript

Поскольку мы используем машинописный текст, @ types / package будет иметь типы, определенные для всех указанных пакетов. Теперь установите ts-node-dev, он будет следить за изменениями в проекте.

npm i -D ts-node-dev

Измените команду сценариев на следующие две

  • npm run dev запустит сервер и будет следить за изменениями файлов.
  • npm run build соберет рабочую версию нашего проекта на es5, поскольку механизм Node.JS не понимает машинописный текст.

Мы будем использовать базу данных MySql. Итак, создайте файл .env и укажите USER, HOST, PASSWORD и DATABASE сервера базы данных. определяется следующим образом.

Теперь создайте папку с именем src, внутри папок с именем DA, routes, service, types и создайте файл server.ts, наш проект. входной файл. Структура будет такой.

На этом мы закончили настройку нашего проекта, теперь перейдем к части реализации.

Реализация

  • Давайте создадим DBManager.ts и DBConnection.ts внутри папки DA.
  • Создайте types.ts внутри типов внутри папки типов.

Определите интерфейс IDBManager, IStudent и введите MySqlType внутри types.ts. IDBManager будет иметь типы нашей функции DBManager. определенный. Разместите следующий код.

Все эти функции получат запрос типа string и paramCollection как массив с числом , string, boolean и undefined в качестве аргументов и возвращает Promise из MySqlError или любого типа. Хотя функция ReadData будет иметь paramCollection в качестве необязательного параметра, поскольку у нее может быть запрос выбора без предложения where.

Теперь перейдите в DBConnection.ts, поместите следующий код.

Теперь перейдите в DBManager.ts, поместите следующий код.

Эти функции отклонят, если есть какая-либо ошибка, в противном случае разрешат, если запрос успешно выполнен. В этом проекте мы реализуем простую операцию CRUD для базы данных студентов.

Создайте файл StudentDA.ts в папке DA со следующим кодом. Позвольте мне описать, что этот файл содержит вместо кода. Хотя вы получите реализацию кода в моем репозитории на GitHub.

У нас будет класс с именем StudentDA, который расширит класс DBManager. Следующие функции определены в классе StudentDA. Функции DBManager возвращают обещание, мы будем использовать async / await с try / catch в вызывающей функции. При успешном выполнении запроса StudentDA’s вернет результат, а в случае ошибки вызовет ошибку на уровне вызывающей функции или службы.

  • GetStudents: эта функция извлекает записи всех учащихся. Он передает SQL-запрос методу ReadData класса DBManager. При успешном выполнении запроса он вернет результат, а в случае ошибки он выдаст ошибку вызывающей функции или уровню сервиса.
  • GetStudent (id): эта функция извлекает запись об отдельном учащемся. Он получает идентификатор типа string от уровня службы или вызывающей функции. Он передает SQL-запрос с идентификатором студента как paramColection как массив в класс DBManager метода ReadData.
  • CreateStudent (data: IStudent) : Эта функция создаст запись студента. Он получает записи об учащемся как тип IStudent. Он передает SQL-запрос с данными студента как paramCollection как Array в метод InsertOrUpdateData класса DBManager.
  • UpdateStudent (данные: IStudent): эта функция обновит запись об одном студенте. Он получает запись студента IStudent вместе с идентификатором. Он передает SQL-запрос с данными студента как paramCollection как Array в метод InsertOrUpdate класса DBManager.
  • DeleteStudent (id: string): эта функция удаляет одну запись студента. Он получает идентификатор студента. Он передает SQL-запрос с идентификатором студента как paramCollection как массив в метод DeleteData класса DBManager.

Теперь создайте файл index.ts внутри папки DA, который будет нашим корневым или общим файлом для экспорта всех модулей из папки DA. Импортируйте класс StudentDA и экспортируйте его из index.ts.

Теперь создайте student.service.ts внутри служебной папки. Этот файл будет содержать всю бизнес-логику. Здесь мы не будем писать бизнес-логику, хотя мы будем использовать ее для получения данных из маршрутов и передачи на уровень DA. Ниже приведен код для student.service.ts.

Теперь создайте index.ts внутри служебной папки, импортируйте student.service.ts и экспортируйте его. Любой файл, который вы создадите внутри служебной папки, импортируйте в index.ts и экспортируйте сюда. Это применимо также к папкам DA и маршрутам.

Теперь создайте student.routes.ts внутри папки маршрутов и вставьте следующий код.

На самом деле он получает два параметра: route и studentService, и соответственно определяет все маршруты. Для каждого маршрута мы вызываем соответствующую служебную функцию и получаем результат.

Теперь откройте server.ts, главный входной файл сервера. Вставьте следующий код.

Мы импортируем все необходимые пакеты и модули в server.ts.

Здесь мы будем использовать внедрение зависимостей, передав DA и службу на уровень службы и контроллера. Благодаря этому все модули остаются свободными. Модули не зависят друг от друга.

В функции StudentRouter мы передаем маршрутизатор и объект studentService, который снова принимает объект StudentDA в конструкторе.

Наш проект настроен. Откройте командную строку и перейдите в каталог проекта.

Есть два сценария для запуска dev и build.

Когда мы будем разрабатывать наш проект, мы будем использовать npm run dev.

Когда мы будем развертывать наш проект в производственной среде, мы будем использовать npm run build.

Теперь запустите npm run dev, нажмите все API из POSTMAN. Вы получите соответствующий результат.

И это конец.

Я постарался как можно лучше объяснить. Хотя, если у вас есть сомнения, прокомментируйте или свяжитесь со мной.

Проверьте исходный код репозитория GitHub



Санкхадип Саманта

Разработчик полного стека, Code Quotient | Технический писатель и куратор социальных сетей на BlogMarch

Найди меня в Linkedin 😃 и Github 😅