Что такое луковая архитектура?
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