Explanation¶
Understanding-oriented discussions about architecture and design decisions.
What is hdmi?¶
hdmi is a lightweight dependency injection framework for Python 3.13+. It separates configuration from validation/runtime, giving you:
Early error detection: Configuration issues (cycles, scopes, missing deps) caught at build time
Lazy instantiation: Services are created only when needed
Type-driven: Uses Python’s standard type annotations
Scope safety: Prevents lifetime bugs at build time
Minimal boilerplate: No decorators, no YAML, no complex configuration
Core Philosophy¶
Fail Fast, Run Lazy
Configuration errors (including scope violations) should be detected immediately when you build the container. Service instantiation should happen as late as possible, only when actually needed.
Type Annotations as Truth
The dependency graph is derived from Python’s type annotations. If your type checker is happy, hdmi will be happy. No separate configuration required.
Scope Safety First
Services can only depend on services with the same or longer lifetime. This prevents common bugs like singletons capturing scoped instances.
Simplicity by Design
Two core concepts (ContainerBuilder, Container), one clear workflow (configure → build/validate → resolve). No magic, no surprises, just straightforward dependency injection.
Design Principles¶
Late Resolution: Services instantiated just-in-time, not eagerly
Immutable Providers: Once validated, the dependency graph is frozen
Type-Driven: Python type annotations define dependencies
No External DSL: Pure Python, no YAML/XML configuration required
Minimal Overhead: Lightweight and fast
Async-First: All service resolution is async for modern Python applications