Sunrabbit

DI на уровне фреймворка: под силу даже начинающим разработчикам Node.js

  • Язык написания: Корейский
  • Страна: Все страныcountry-flag
  • ИТ

Создано: 2024-11-08

Создано: 2024-11-08 14:02

При разработке серверов с использованием Node.js часто возникает соблазн использовать множество функций Spring.

Это связано с тем, что Spring — структурированная, систематизированная платформа, из которой сложно произвольно выйти.


Поэтому в сообществе Node.js появился фреймворк Nest.js.

Многие разработчики стремились к созданию серверов в структурированной форме, подобной Spring.


Однако DI в Spring использует отражение во время выполнения, обеспечивая поддержку DI на уровне языка.

То же самое относится и к Dotnet, где DI осуществляется с помощью отражения на основе атрибутов.


Как же тогда Nest.js осуществляет DI?

Spring и Dotnet основаны на компилируемых языках, которые поддерживают отражение на уровне языка, в то время как...

ecma script — всего лишь интерпретируемый язык.


Ниже приведен один из примеров из руководства Nest.js.


Очевидно, что после компиляции код TypeScript, написанный таким образом, будет без тегов типов, и поэтому не будет известен тип аргумента, необходимого для конструктора класса.


Решение нашлось в спецификации языка.

Reflect

К счастью, на уровне языка существует функция, позволяющая добавлять метаданные в каждый объект.

DI на уровне фреймворка: под силу даже начинающим разработчикам Node.js


Это простая функция добавления и получения метаданных для объектов.


Поэтому TypeScript подумал:

А что если при компиляции класса добавлять информацию о типах в метаданные?


Таким образом, TypeScript хранит информацию о типах аргументов, необходимых для конструктора, в Reflect для каждого класса, к которому применяется декоратор класса.

DI на уровне фреймворка: под силу даже начинающим разработчикам Node.js

Здесь не используется никакая трансформация или "черная магия", это исключительно функция компилятора TypeScript.


Если типы аргументов конструктора класса хранятся в метаданных этого класса,

мы можем получить эти типы при вызове класса и использовать их.


Реализацию можно посмотреть в NestJS, но это слишком сложно, поэтому я порекомендую другую библиотеку.


Библиотека разработана Microsoft, поэтому код довольно чистый.

Рекомендую ознакомиться с ней, на этом я закончу статью.

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

[Java] Концепция Reflection и способы использованияJava Reflection — это API, который позволяет создавать объекты, получать доступ к полям и методам через информацию о классах, загруженных в кучу. Используется в Spring Framework и других фреймворках для создания объектов и внедрения зависимостей.
제이온
제이온
제이온
제이온

April 25, 2024

Опыт участия в проектах с открытым исходным кодомЭта статья делится опытом участия в проектах с открытым исходным кодом и вдохновляет на преодоление страха и совершение первого шага. Она рассказывает о процессе обретения уверенности и роста, начиная с небольших улучшений.
seungwon
seungwon
seungwon
seungwon

May 3, 2025

[Эффективный Java] Элемент 6. Избегайте ненужного создания объектовНенужное создание объектов приводит к расточительности памяти, поэтому для объектов, таких как строки или логические значения, лучше использовать литералы или статические фабричные методы.
제이온
제이온
제이온
제이온

April 28, 2024

29.11.2024 Поздние новости: платная подписка на Replit / Хорошие привычки в разработке ПОВ записи блога от 29 ноября 2024 года мы делимся опытом использования платной подписки на Replit и представляем 10 хороших привычек в разработке программного обеспечения. Обсуждаются стратегии эффективного кодирования и рефакторинга, а также важность тес
Charles Lee
Charles Lee
Charles Lee
Charles Lee

November 29, 2024