🧪 Dependency Injection (DI)
Dispytch supports a FastAPI-style Dependency Injection system to cleanly manage your handler dependencies—keeping your logic modular, testable, and DRY.
💡 Why Use DI?
♻️ Decoupling – Separate business logic from infrastructure concerns
✅ Testability – Easily mock or override dependencies in tests
🔄 Reusability – Centralize shared resources and logic
How It Works
Handlers declare dependencies using Python’s type annotations combined with Dispytch’s Dependency
wrapper and Event
generic class.
Example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
At runtime, Dispytch:
-
Parses the handler signature.
-
Resolves dependencies using the provided factory functions (sync or async).
-
Injects results directly into the handler.
-
Handles cleanup automatically for context-managed dependencies.
🧩 Nested Dependencies
Dispytch supports dependency chains—where one dependency depends on another. Each layer is resolved automatically, with full lifecycle management.
✍️ Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
🔍 What's happening
get_service
declares a dependency onget_config
- Dispytch resolves
get_config
, then passes the result toget_service
- The final resolved
Service
is injected into the handler
🌐 Context-Aware Dependencies
Dependency functions can receive contextual information about the current event—such as its topic, type, or payload—by
accepting a typed Event[T]
as an argument.
This enables runtime-aware logic, such as per-event logging, dynamic configuration, or tenant resolution.
✍️ Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
🧰 Common Use Cases
-
📋 Structured logging – Include event context in every log entry
-
🏢 Per-tenant or per-topic logic – Apply tenant-specific rules or routing
-
⚙️ Dynamic configuration – Adjust behavior based on event payload or headers
🔁 Alternative Syntax
As an alternative for the Annotated[T, Dependency(...)]
style, Dispytch lets you inject dependencies by assigning a
Dependency
instance directly as a default value for a handler parameter. Functionally the same—just a different
flavor.
📋 Note: This injection method does not work for the
Event
parameter. You must use explicit type hints forEvent
to enable proper injection.
✍️ Example
1 2 3 4 5 6 7 8 9 10 |
|