aiogram¶
Though it is not required, you can use dishka-aiogram integration. It features:
automatic REQUEST scope management using middleware
passing
TelegramObjectobject andAiogramMiddlewareDatadict 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¶
Import
from dishka.integrations.aiogram import (
AiogramProvider,
FromDishka,
inject,
setup_dishka,
)
from dishka import make_async_container, Provider, provide, Scope
Create provider. You can use
aiogram.types.TelegramObjectanddishka.integrations.aiogram.AiogramMiddlewareDataas 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:
...
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],
):
(optional) Use
AiogramProvider()when creating container if you are going to useaiogram.types.TelegramObjectordishka.integrations.aiogram.AiogramMiddlewareDatain providers.
container = make_async_container(YourProvider(), AiogramProvider())
Setup
dishkaintegration.auto_inject=Trueis required unless you explicitly use@injectdecorator
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)
(optional) Close container on dispatcher shutdown
dispatcher.shutdown.register(container.close)