This commit is contained in:
2025-11-07 21:25:35 +03:00
parent 16e7cc21fb
commit 8edd59c1b8
11 changed files with 48 additions and 78 deletions
+13 -6
View File
@@ -3,10 +3,12 @@
Внедрение зависимостей
=======================
Внедрение зависимостей (Dependency Injection, DI) — это паттерн проектирования, который помогает писать слабосвязанный, легко тестируемый и расширяемый код. Вместо того чтобы обработчики сами создавали нужные им объекты (зависимости), они лишь объявляют их в качестве аргументов. В момент вызова ``Argenta`` автоматически "внедряет" эти зависимости.
Внедрение зависимостей (Dependency Injection, DI) — это паттерн проектирования, который помогает писать слабосвязанный, легко тестируемый и расширяемый код. Вместо того чтобы обработчики сами создавали нужные им объекты (зависимости), они получают их извне.
``Argenta`` использует библиотеку ``dishka`` для реализации DI, что позволяет декларативно объявлять зависимости прямо в сигнатурах ваших обработчиков.
Подробнее о `DI`, `IoC` и API для создания провайдеров можно прочитать в `официальной документации dishka <https://dishka.readthedocs.io/en/stable/di_intro.html>`_.
Подробнее о **DI**, **IoC** и API для создания провайдеров можно прочитать в `официальной документации dishka <https://dishka.readthedocs.io/en/stable/di_intro.html>`_.
-----
Основная идея
-------------
@@ -14,7 +16,7 @@
Представьте, что вашему обработчику для работы нужен доступ к базе данных. Вместо импорта и инициализации соединения внутри функции, вы просто объявляете его как аргумент с аннотацией типа:
.. note::
``argenta.di.FromDishka`` является псевдонимом для ``dishka.FromDishka``, и они полностью взаимозаменяемы.
``argenta.di.FromDishka`` является алиасом для ``dishka.FromDishka``, и они полностью взаимозаменяемы.
.. literalinclude:: ../code_snippets/dependency_injection/snippet.py
:language: python
@@ -32,6 +34,8 @@
:language: python
:linenos:
-----
Как это работает?
-----------------
@@ -40,6 +44,8 @@
* **Провайдер (Provider)** — это "рецепт", который объясняет, как создавать и настраивать ту или иную зависимость (например, подключение к БД, API-клиент или любой другой сервис).
* **Контейнер (IoC Container)** — это "фабрика", которая хранит все рецепты (провайдеры) и по запросу создаёт и выдаёт готовые зависимости.
-----
Встроенные провайдеры
-----------------------
@@ -50,14 +56,15 @@
.. literalinclude:: ../code_snippets/dependency_injection/snippet4.py
:language: python
:linenos:
-----
Обмен данными между хендлерами
------------------------------
Помимо DI, обработчики могут обмениваться данными в рамках сессии через **объект контекста**. В ``Argenta`` эту роль выполняет объект ``Response``.
Помимо DI, обработчики могут обмениваться данными в рамках сессии через **объект контекста**. В ``Argenta`` эту роль выполняет объект ``DataBridge``.
Каждый обработчик может записывать в него данные, а также читать, обновлять и удалять их.
.. seealso::
Подробнее об этом можно прочитать в разделе :ref:`root_api_response`.
Подробнее об этом можно прочитать в разделе :ref:`root_api_bridge`.