Autoregistration¶
What you’ll learn¶
How
missing_policyanddependency_registration_policyaffect behavior.
Resolve-time chain¶
Run locally¶
uv run python examples/ex_09_autoregistration/01_resolve_chain.py
"""Focused example: resolve-time autoregistration of a dependency chain."""
from __future__ import annotations
from dataclasses import dataclass
from diwire import Container
class Leaf:
pass
@dataclass(slots=True)
class Branch:
leaf: Leaf
@dataclass(slots=True)
class Root:
branch: Branch
def main() -> None:
container = Container()
resolved = container.resolve(Root)
print(
f"autoregister_chain={isinstance(resolved.branch.leaf, Leaf)}",
) # => autoregister_chain=True
if __name__ == "__main__":
main()
Registration-time dependency autoregistration¶
Run locally¶
uv run python examples/ex_09_autoregistration/02_add_dependency_autoregister.py
"""Focused example: registration-time dependency autoregistration."""
from __future__ import annotations
from dataclasses import dataclass
from diwire import Container
class Dependency:
pass
@dataclass(slots=True)
class Root:
dependency: Dependency
def main() -> None:
container = Container()
container.add(Root)
resolved = container.resolve(Root)
autoregistered = isinstance(resolved.dependency, Dependency)
print(
f"autoregister_deps_on_register={autoregistered}",
) # => autoregister_deps_on_register=True
if __name__ == "__main__":
main()
Strict mode¶
Run locally¶
uv run python examples/ex_09_autoregistration/03_strict_mode.py
"""Focused example: strict mode without concrete autoregistration."""
from __future__ import annotations
from dataclasses import dataclass
from diwire import Container, DependencyRegistrationPolicy, MissingPolicy
from diwire.exceptions import DIWireDependencyNotRegisteredError
class Dependency:
pass
@dataclass(slots=True)
class Root:
dependency: Dependency
def main() -> None:
container = Container(
missing_policy=MissingPolicy.ERROR,
dependency_registration_policy=DependencyRegistrationPolicy.IGNORE,
)
try:
container.resolve(Root)
except DIWireDependencyNotRegisteredError as error:
error_name = type(error).__name__
print(f"strict_missing={error_name}") # => strict_missing=DIWireDependencyNotRegisteredError
if __name__ == "__main__":
main()
UUID special type¶
Run locally¶
uv run python examples/ex_09_autoregistration/04_uuid_special_type.py
"""Focused example: ``uuid.UUID`` requires explicit registration."""
from __future__ import annotations
import uuid
from dataclasses import dataclass
from diwire import Container, MissingPolicy
from diwire.exceptions import DIWireDependencyNotRegisteredError
@dataclass(slots=True)
class Root:
request_id: uuid.UUID
def main() -> None:
container = Container(missing_policy=MissingPolicy.REGISTER_ROOT)
try:
container.resolve(Root)
except DIWireDependencyNotRegisteredError:
skipped_before_registration = True
else:
skipped_before_registration = False
expected_uuid = uuid.UUID(int=0)
container.add_instance(expected_uuid)
resolved = container.resolve(Root)
print(
f"uuid_skipped_until_registered={skipped_before_registration and resolved.request_id is expected_uuid}",
) # => uuid_skipped_until_registered=True
if __name__ == "__main__":
main()