This commit is contained in:
2025-11-02 00:17:28 +03:00
parent acddb1fbc6
commit df7313912c
26 changed files with 501 additions and 566 deletions
+11 -13
View File
@@ -3,32 +3,30 @@
Внедрение зависимостей
=======================
Внедрение зависимостей (Dependency Injection, DI) — это паттерн проектирования, который помогает писать слабосвязанный, легко тестируемый и расширяемый код. Вместо того чтобы хендлеры сами создавали нужные им объекты (зависимости) они лишь объявляют о необходимости в их получении, а ``Argenta`` "внедряет" их в хендлеры в момент вызова.
Внедрение зависимостей (Dependency Injection, DI) — это паттерн проектирования, который помогает писать слабосвязанный, легко тестируемый и расширяемый код. Вместо того чтобы обработчики сами создавали нужные им объекты (зависимости), они лишь объявляют их в качестве аргументов. В момент вызова ``Argenta`` автоматически "внедряет" эти зависимости.
``Argenta`` использует популярную библиотеку ``dishka`` для реализации DI, что позволяет вам декларативно объявлять зависимости прямо в сигнатурах ваших хендлеров.
Более подробно про ``DI``, ``IoC``, ``API`` создания провайдеров и другое вы можете прочитать тут_.
.. _тут : https://dishka.readthedocs.io/en/stable/di_intro.html
``Argenta`` использует библиотеку ``dishka`` для реализации DI, что позволяет декларативно объявлять зависимости прямо в сигнатурах ваших обработчиков.
Подробнее о `DI`, `IoC` и API для создания провайдеров можно прочитать в `официальной документации dishka <https://dishka.readthedocs.io/en/stable/di_intro.html>`_.
Основная идея
-------------
Представьте, что вашему хендлеру для работы нужен доступ к базе данных. Вместо того чтобы импортировать и инициализировать соединение внутри функции, вы просто объявляете его как аргумент с тайп-хинтом:
Представьте, что вашему обработчику для работы нужен доступ к базе данных. Вместо импорта и инициализации соединения внутри функции, вы просто объявляете его как аргумент с аннотацией типа:
.. note::
``argenta.di.FromDishka`` это алиас к ``dishka.FromDishka``, они полностью взаимозаменяемы.
``argenta.di.FromDishka`` является псевдонимом для ``dishka.FromDishka``, и они полностью взаимозаменяемы.
.. literalinclude:: ../code_snippets/dependency_injection/snippet.py
:language: python
:linenos:
``Argenta`` через ``dishka`` разрешит типы и внедрит зависимость с возвращаемым типом ``Connection``. Прежде чем использовать зависимость, её нужно создать, для этого нужно создать соответствующий провайдер.
``Argenta`` с помощью ``dishka`` разрешит зависимость по типу ``Connection`` и внедрит её. Но прежде чем использовать зависимость, её необходимо объявить в провайдере.
.. literalinclude:: ../code_snippets/dependency_injection/snippet2.py
:language: python
:linenos:
После создания провайдера его нужно зарегистрировать в оркестраторе.
После создания провайдера его необходимо зарегистрировать в оркестраторе.
.. literalinclude:: ../code_snippets/dependency_injection/snippet3.py
:language: python
@@ -45,9 +43,9 @@
Встроенные провайдеры
-----------------------
``Argenta`` поставляется с предопределённым провайдером, который даёт доступ к важным системным зависимостям без какой-либо настройки. К примеру вы можете получить объект ``ArgSpace``, который представляет из себя распаршенные аргументы командной строки при запуске приложения.
``Argenta`` поставляется со встроенным провайдером, который даёт доступ к важным системным зависимостям без дополнительной настройки. Например, вы можете получить объект ``ArgSpace``, который содержит аргументы командной строки, переданные при запуске приложения.
Краткий пример кода, который получает объект ``ArgSpace`` и выводит в консоль аргумент с именем "type":
Пример получения объекта ``ArgSpace`` и вывода в консоль значения аргумента `type`:
.. literalinclude:: ../code_snippets/dependency_injection/snippet4.py
:language: python
@@ -56,9 +54,9 @@
Обмен данными между хендлерами
------------------------------
Помимо DI, хендлеры могут общаться друг с другом в контексте приложения через **объект контекста** ``Argenta`` эту роль выполняет объект ``Response``).
Помимо DI, обработчики могут обмениваться данными в рамках сессии через **объект контекста**. В ``Argenta`` эту роль выполняет объект ``Response``.
Каждый хендлер может записывать данные, читать, обновлять и удалять.
Каждый обработчик может записывать в него данные, а также читать, обновлять и удалять их.
.. seealso::