From 84d50bc2f526b286e2ae463f46615b080bc60876 Mon Sep 17 00:00:00 2001 From: Artur Shiriev Date: Sun, 11 Jan 2026 09:47:32 +0300 Subject: [PATCH] resolve di container in annotations --- packages/modern-di-fastapi/pyproject.toml | 2 +- packages/modern-di-faststream/pyproject.toml | 2 +- packages/modern-di-litestar/pyproject.toml | 2 +- packages/modern-di/modern_di/container.py | 15 ++++++++++++--- .../tests_core/providers/test_factory.py | 19 ++++++++++--------- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/packages/modern-di-fastapi/pyproject.toml b/packages/modern-di-fastapi/pyproject.toml index d9ab6e7..433b272 100644 --- a/packages/modern-di-fastapi/pyproject.toml +++ b/packages/modern-di-fastapi/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Typing :: Typed", "Topic :: Software Development :: Libraries", ] -dependencies = ["fastapi>=0.100", "modern-di>=1.0.0alpha"] +dependencies = ["fastapi>=0.100", "modern-di>=2.0.0alpha1"] version = "0" [project.urls] diff --git a/packages/modern-di-faststream/pyproject.toml b/packages/modern-di-faststream/pyproject.toml index ed25644..31879f2 100644 --- a/packages/modern-di-faststream/pyproject.toml +++ b/packages/modern-di-faststream/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Typing :: Typed", "Topic :: Software Development :: Libraries", ] -dependencies = ["faststream>=0.5,<1", "modern-di>=1.0.0alpha"] +dependencies = ["faststream>=0.5,<1", "modern-di>=2.0.0alpha1"] version = "0" [project.urls] diff --git a/packages/modern-di-litestar/pyproject.toml b/packages/modern-di-litestar/pyproject.toml index fc52184..a7cbc99 100644 --- a/packages/modern-di-litestar/pyproject.toml +++ b/packages/modern-di-litestar/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Typing :: Typed", "Topic :: Software Development :: Libraries", ] -dependencies = ["litestar", "modern-di>=1.0.0alpha1"] +dependencies = ["litestar", "modern-di>=2.0.0alpha1"] version = "0" [project.urls] diff --git a/packages/modern-di/modern_di/container.py b/packages/modern-di/modern_di/container.py index 86436a8..9ad5c45 100644 --- a/packages/modern-di/modern_di/container.py +++ b/packages/modern-di/modern_di/container.py @@ -4,15 +4,13 @@ import typing_extensions from modern_di.group import Group +from modern_di.providers.abstract import AbstractProvider from modern_di.registries.cache_registry import CacheRegistry from modern_di.registries.context_registry import ContextRegistry from modern_di.registries.providers_registry import ProvidersRegistry from modern_di.scope import Scope -if typing.TYPE_CHECKING: - from modern_di.providers.abstract import AbstractProvider - T_co = typing.TypeVar("T_co", covariant=True) @@ -44,6 +42,7 @@ def __init__( self.providers_registry = parent_container.providers_registry else: self.providers_registry = ProvidersRegistry() + self.providers_registry.add_providers(di_container=ContainerProvider()) if groups: for one_group in groups: self.providers_registry.add_providers(**one_group.get_providers()) @@ -99,3 +98,13 @@ def __deepcopy__(self, *_: object, **__: object) -> "typing_extensions.Self": def __copy__(self, *_: object, **__: object) -> "typing_extensions.Self": """Prevent cloning object.""" return self + + +class ContainerProvider(AbstractProvider[typing.Any]): + __slots__ = AbstractProvider.BASE_SLOTS + + def __init__(self) -> None: + super().__init__(scope=Scope.APP, bound_type=Container) + + def resolve(self, container: Container) -> Container: + return container diff --git a/packages/modern-di/tests_core/providers/test_factory.py b/packages/modern-di/tests_core/providers/test_factory.py index 3d5fc62..bd6b751 100644 --- a/packages/modern-di/tests_core/providers/test_factory.py +++ b/packages/modern-di/tests_core/providers/test_factory.py @@ -12,6 +12,7 @@ class SimpleCreator: @dataclasses.dataclass(kw_only=True, slots=True) class DependentCreator: dep1: SimpleCreator + di_container: Container class MyGroup(Group): @@ -20,19 +21,16 @@ class MyGroup(Group): def test_app_factory() -> None: - app_container = Container() - instance1 = app_container.resolve_provider(MyGroup.app_factory) - instance2 = app_container.resolve_provider(MyGroup.app_factory) - assert instance1 is not instance2 - - -def test_app_factory_with_registry() -> None: app_container = Container(groups=[MyGroup]) - instance1 = app_container.resolve(dependency_type=SimpleCreator) - instance2: SimpleCreator = app_container.resolve(dependency_name="app_factory") + instance1 = app_container.resolve_provider(MyGroup.app_factory) + instance2 = app_container.resolve(dependency_type=SimpleCreator) + instance3: SimpleCreator = app_container.resolve(dependency_name="app_factory") assert isinstance(instance1, SimpleCreator) assert isinstance(instance2, SimpleCreator) + assert isinstance(instance3, SimpleCreator) assert instance1 is not instance2 + assert instance1 is not instance3 + assert instance2 is not instance3 def test_request_factory() -> None: @@ -41,6 +39,9 @@ def test_request_factory() -> None: instance1 = request_container.resolve_provider(MyGroup.request_factory) instance2 = request_container.resolve_provider(MyGroup.request_factory) assert instance1 is not instance2 + assert isinstance(instance1.di_container, Container) + assert instance1.di_container.scope == Scope.REQUEST + assert instance1.di_container is instance2.di_container request_container = app_container.build_child_container(scope=Scope.REQUEST) instance3 = request_container.resolve_provider(MyGroup.request_factory)