Add dependency injection system#25
Open
DaviddeBest-TNO wants to merge 5 commits into
Open
Conversation
Handlers can now declare dependencies using Depends() in Annotated type
hints. The framework resolves them at call time before invoking the handler.
from typing import Annotated
from src import Depends
def get_db() -> MyDatabase:
return MyDatabase(url='...')
@kb.answer_ki(name='...', graph_pattern='...')
def handler(
binding_set: list[PersonBinding],
info: KnowledgeInteractionInfo,
db: Annotated[MyDatabase, Depends(get_db)],
) -> list[PersonBinding]:
return db.query(binding_set)
- src/depends.py: Depends(factory, cache=True) dataclass
- src/di.py: resolve_dependencies() — inspects Annotated hints, resolves
transitively, caches per-call by factory identity when cache=True
- KnowledgeBase.call(): resolves deps and passes as kwargs before handler call
- Depends exported from src public API
Behaviour:
- Sync-only factories (async deferred to a follow-up issue)
- Transitive resolution: factories can themselves declare Depends params
- cache=True (default): factory called once per KI call, result shared
- cache=False: factory called fresh every time it is needed
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Demonstrates Depends() with a realistic sensor-readings KB: - Basic injection: SensorRepository injected via Depends(get_sensor_repository) - Transitive deps: get_sensor_repository declares Depends(get_config) - Shared cache: get_config called once even though both the factory and the handler parameter depend on it Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
0264481 to
f12da35
Compare
Sophietje
reviewed
May 21, 2026
Sophietje
left a comment
There was a problem hiding this comment.
I'm not sure about the filename di.py, it's not immediately clear that this will be a dependency injection resolver, perhaps rename to dependency_injection_resolver.py or dependency_resolver.py?
Contributor
Author
|
Agreed and two separate files is unnecessary so renamed depends.py and di.py to dependency_injection.py |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds FastAPI-like dependency injection system.
Define dependencies in handler arguments with a factory function that are loaded once per handler and work recursively (dependencies define their own dependencies), see example.