diff --git a/src/dependency_injector/wiring.py b/src/dependency_injector/wiring.py index 9de6f823..a3a87e20 100644 --- a/src/dependency_injector/wiring.py +++ b/src/dependency_injector/wiring.py @@ -628,21 +628,6 @@ def _fetch_reference_injections( # noqa: C901 return injections, closing -def _locate_dependent_closing_args( - provider: providers.Provider, closing_deps: Dict[str, providers.Provider] -) -> Dict[str, providers.Provider]: - for arg in [ - *getattr(provider, "args", []), - *getattr(provider, "kwargs", {}).values(), - ]: - if not isinstance(arg, providers.Provider): - continue - if isinstance(arg, providers.Resource): - closing_deps[str(id(arg))] = arg - - _locate_dependent_closing_args(arg, closing_deps) - - def _bind_injections(fn: Callable[..., Any], providers_map: ProvidersMap) -> None: patched_callable = _patched_registry.get_callable(fn) if patched_callable is None: @@ -664,10 +649,9 @@ def _bind_injections(fn: Callable[..., Any], providers_map: ProvidersMap) -> Non if injection in patched_callable.reference_closing: patched_callable.add_closing(injection, provider) - deps = {} - _locate_dependent_closing_args(provider, deps) - for key, dep in deps.items(): - patched_callable.add_closing(key, dep) + + for resource in provider.traverse(types=[providers.Resource]): + patched_callable.add_closing(str(id(resource)), resource) def _unbind_injections(fn: Callable[..., Any]) -> None: diff --git a/tests/unit/samples/wiringstringids/resourceclosing.py b/tests/unit/samples/wiringstringids/resourceclosing.py index c4d1f20f..5a3d2ba4 100644 --- a/tests/unit/samples/wiringstringids/resourceclosing.py +++ b/tests/unit/samples/wiringstringids/resourceclosing.py @@ -59,12 +59,13 @@ def init_service(counter: Counter, _list: List[int], _dict: Dict[str, int]): class Container(containers.DeclarativeContainer): + config = providers.Configuration(default={"a": 1, "b": 4}) counter = providers.Singleton(Counter) _list = providers.List( - providers.Callable(lambda a: a, a=1), providers.Callable(lambda b: b, 2) + providers.Callable(lambda a: a, a=config.a), providers.Callable(lambda b: b, 2) ) _dict = providers.Dict( - a=providers.Callable(lambda a: a, a=3), b=providers.Callable(lambda b: b, 4) + a=providers.Callable(lambda a: a, a=3), b=providers.Callable(lambda b: b, config.b) ) service = providers.Resource(init_service, counter, _list, _dict=_dict) service2 = providers.Resource(init_service, counter, _list, _dict=_dict)