aiogram

Though it is not required, you can use dishka-aiogram integration. It features:

  • automatic REQUEST scope management using middleware

  • passing TelegramObject object and AiogramMiddlewareData dict as a context data to providers for telegram events (update object fields)

  • automatic injection of dependencies into handler function.

Only async handlers are supported.

How to use

  1. Import

from dishka.integrations.aiogram import (
    AiogramProvider,
    FromDishka,
    inject,
    setup_dishka,
)
from dishka import make_async_container, Provider, provide, Scope
  1. Create provider. You can use aiogram.types.TelegramObject and dishka.integrations.aiogram.AiogramMiddlewareData as a factory parameter to access on REQUEST-scope

class YourProvider(Provider):
    @provide(scope=Scope.REQUEST)
    def create_x(self, event: TelegramObject, middleware_data: AiogramMiddlewareData) -> X:
         ...
  1. Mark those of your handlers parameters which are to be injected with FromDishka[]

@dp.message()
async def start(
    message: Message,
    gateway: FromDishka[Gateway],
):

3a. (optional) decorate them using @inject if you are not using auto-injection

@dp.message()
@inject
async def start(
    message: Message,
    gateway: FromDishka[Gateway],
):
  1. (optional) Use AiogramProvider() when creating container if you are going to use aiogram.types.TelegramObject or dishka.integrations.aiogram.AiogramMiddlewareData in providers.

container = make_async_container(YourProvider(), AiogramProvider())
  1. Setup dishka integration. auto_inject=True is required unless you explicitly use @inject decorator

setup_dishka(container=container, router=dp, auto_inject=True)

Or pass your own inject decorator

setup_dishka(container=container, router=dp, auto_inject=my_inject)
  1. (optional) Close container on dispatcher shutdown

dispatcher.shutdown.register(container.close)