From ac124f5b080ce77efdd0763fcb8d890a06088632 Mon Sep 17 00:00:00 2001 From: Alex Root Junior Date: Sun, 13 Aug 2023 22:14:33 +0300 Subject: [PATCH] Fixed structure of DI docs page, included it in toctree --- docs/dispatcher/dependency_injection.rst | 34 +++++++++++++++++------- docs/dispatcher/index.rst | 1 + 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/docs/dispatcher/dependency_injection.rst b/docs/dispatcher/dependency_injection.rst index 15b7c908..0e7af388 100644 --- a/docs/dispatcher/dependency_injection.rst +++ b/docs/dispatcher/dependency_injection.rst @@ -2,16 +2,23 @@ Dependency injection #################### -Dependency injection is a programming technique that makes a class independent of its dependencies. It achieves that by decoupling the usage of an object from its creation. This helps you to follow `SOLID's `_ dependency inversion and single responsibility principles. +Dependency injection is a programming technique that makes a class independent of its dependencies. +It achieves that by decoupling the usage of an object from its creation. +This helps you to follow `SOLID's `_ dependency +inversion and single responsibility principles. How it works in aiogram ======================= -For each update :class:`Dispatcher` passes handling context data. Filters and middleware can also make changes to the context. -To access contextual data you should specify corresponding keyword parameter in handler or filter. For example, to get :class:`FSMContext` we do it like that: +For each update :class:`aiogram.dispatcher.dispatcher.Dispatcher` passes handling context data. +Filters and middleware can also make changes to the context. + +To access contextual data you should specify corresponding keyword parameter in handler or filter. +For example, to get :class:`aiogram.fsm.context.FSMContext` we do it like that: .. code-block:: python + @router.message(ProfileCompletion.add_photo, F.photo) async def add_photo( message: types.Message, bot: Bot, state: FSMContext @@ -24,33 +31,42 @@ Injecting own dependencies Aiogram provides several ways to complement / modify contextual data. -The first and easiest way is to simply specify the named arguments in :class:`Dispatcher` initialization, polling start methods or :class:`SimpleRequestHandler` initialization if you use webhooks. +The first and easiest way is to simply specify the named arguments in +:class:`aiogram.dispatcher.dispatcher.Dispatcher` initialization, polling start methods +or :class:`aiogram.webhook.aiohttp_server.SimpleRequestHandler` initialization if you use webhooks. .. code-block:: python + async def main() -> None: dp = Dispatcher(..., foo=42) return await dp.start_polling( - bot, allowed_updates=dp.resolve_used_update_types(), bar="Bazz" + bot, bar="Bazz" ) + Analogy for webhook: .. code-block:: python + async def main() -> None: dp = Dispatcher(..., foo=42) handler = SimpleRequestHandler(dispatcher=dp, bot=bot, bar="Bazz") ... # starting webhook -:class:`Dispatcher`'s workflow data also can be supplemented by setting values as in a dictionary: + +:class:`aiogram.dispatcher.dispatcher.Dispatcher`'s workflow data also can be supplemented +by setting values as in a dictionary: .. code-block:: python + dp = Dispatcher(...) dp["eggs"] = Spam() + The middlewares updates the context quite often. You can read more about them on this page: -- `Middlewares `__ +- :ref:`Middlewares ` The last way is to return a dictionary from the filter: -.. literalinclude:: ../../../examples/context_addition_from_filter.py +.. literalinclude:: ../../examples/context_addition_from_filter.py -...or using MagicFilter with :code:`as_()` method. (`Read more `__) +...or using :ref:`MagicFilter ` with :code:`.as_(...)` method. diff --git a/docs/dispatcher/index.rst b/docs/dispatcher/index.rst index 73dae308..614721ef 100644 --- a/docs/dispatcher/index.rst +++ b/docs/dispatcher/index.rst @@ -34,3 +34,4 @@ So, you can use both of them with *aiogram*. errors long_polling webhook + dependency_injection