impl di in handlers with support custom provider

This commit is contained in:
2025-10-13 01:13:28 +03:00
parent e2753ef904
commit 462a8088e9
12 changed files with 293 additions and 149 deletions
+2
View File
@@ -0,0 +1,2 @@
from argenta.di.integration import inject as inject
from argenta.di.integration import FromDishka as FromDishka
+45
View File
@@ -0,0 +1,45 @@
__all__ = ["inject", "setup_dishka", "FromDishka"]
from typing import Any, Callable, TypeVar
from dishka import Container, FromDishka
from dishka.integrations.base import wrap_injection, is_dishka_injected
from argenta.response import Response
from argenta.app import App
T = TypeVar("T")
def inject(func: Callable[..., T]) -> Callable[..., T]:
return wrap_injection(
func=func,
is_async=False,
container_getter=_get_container_from_response,
)
def setup_dishka(app: App, *, auto_inject: bool = False) -> None:
if auto_inject:
_auto_inject_handlers(app)
def _get_container_from_response(
args: tuple[Any, ...], kwargs: dict[str, Any]
) -> Container:
for arg in args:
if isinstance(arg, Response):
if hasattr(arg, "_dishka_container"):
return arg._dishka_container # pyright: ignore[reportPrivateUsage]
break
raise RuntimeError("dishka container not found in Response")
def _auto_inject_handlers(app: App) -> None:
for router in app.registered_routers:
for command_handler in router.command_handlers:
if not is_dishka_injected(command_handler.handler_as_func):
injected_handler = inject(command_handler.handler_as_func)
command_handler.handler_as_func = injected_handler
+14
View File
@@ -0,0 +1,14 @@
from argenta.orchestrator.argparser import ArgParser
from dishka import Provider, provide, Scope # type: ignore
from argenta.orchestrator.argparser.entity import ArgSpace
class SystemProvider(Provider):
def __init__(self, arg_parser: ArgParser):
super().__init__()
self._arg_parser: ArgParser = arg_parser
@provide(scope=Scope.APP)
def get_argspace(self) -> ArgSpace:
return self._arg_parser.parse_args()