Autoregistration

What you’ll learn

  • How missing_policy and dependency_registration_policy affect 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()