resolver_context¶
Sometimes you can’t (or don’t want to) pass a diwire.Container through every layer of your app. For those
cases, diwire provides diwire.resolver_context: a shared diwire.ResolverContext instance.
What it is (and isn’t)¶
Resolver binding is task/thread-safe and uses
contextvars.resolve/aresolve/enter_scopeuse the currently bound resolver first, and fall back to the latest container configured for thisResolverContext.injectcan use one of three resolver sources at call time: explicitdiwire_resolver, bound resolver fromresolver_context, or fallback container compile when the fallback container is configured withuse_resolver_context=True.Fallback container policy is last container wins per
ResolverContextinstance.
Basic usage¶
Build/configure a container (this automatically registers fallback for
resolver_contextcalls).Use
@resolver_context.injectfor function wrappers.Optionally bind resolver context explicitly when you need call-local precedence:
from diwire import Container, resolver_context class MyDependency: ... container = Container() container.add(MyDependency) with container.compile(): value = resolver_context.resolve(MyDependency) assert isinstance(value, MyDependency)
Runnable example: ResolverContext.
Testing note¶
Prefer one of:
pass
diwire_resolver=container.compile()explicitly in wrappers, orcreate an app-owned
ResolverContext()per test for isolation.