Parent
#27
What to build
Make the dependency injection resolver async-aware so that Depends factories can be either def or async def.
Resolver: resolve_dependencies() becomes async def. For each Depends factory, detect whether it is a coroutine function via asyncio.iscoroutinefunction(). Async factories are awaited directly; sync factories are called directly (no to_thread — factories are typically fast initializers). Caching semantics are unchanged: cache=True factories are called at most once per invocation, cache=False factories are called fresh each time.
Transitive resolution: The recursive call to resolve a factory's own dependencies must also be awaited, since nested factories may themselves be async.
Overrides: dependency_overrides behavior is unchanged — an override factory replaces the original and may itself be sync or async independently of the original.
Acceptance criteria
Blocked by
Parent
#27
What to build
Make the dependency injection resolver async-aware so that
Dependsfactories can be eitherdeforasync def.Resolver:
resolve_dependencies()becomesasync def. For eachDependsfactory, detect whether it is a coroutine function viaasyncio.iscoroutinefunction(). Async factories are awaited directly; sync factories are called directly (noto_thread— factories are typically fast initializers). Caching semantics are unchanged:cache=Truefactories are called at most once per invocation,cache=Falsefactories are called fresh each time.Transitive resolution: The recursive call to resolve a factory's own dependencies must also be awaited, since nested factories may themselves be async.
Overrides:
dependency_overridesbehavior is unchanged — an override factory replaces the original and may itself be sync or async independently of the original.Acceptance criteria
resolve_dependencies()isasync defDependsfactories (async def) are detected and awaitedDependsfactories (def) continue to work without changesdependency_overridesworks with async replacement factoriescache=True/False) preserved for both sync and async factoriesuv run ruff check .passesBlocked by