evoid-di
Dependency injection engine — Intent Handler system
Quick Start • Intent Handler • Three Levels • API
Quick Start
uv add evoid-di
Method 1: Intent Handler (Recommended)
from evoid_di import register_handlers
# Register DI engine as Intent handlers
register_handlers(
rules={"notifier": {"default": "memory"}},
implementations={"memory": lambda: MemoryNotifier()},
)
Method 2: Direct API
from evoid_di import DIEngine
di = DIEngine()
di.register("db", lambda: create_db("app.db"))
db = di.resolve("db")
Intent Handler
evoid-di registers dependency resolution as Intent handlers.
Three Levels
Level 1: Simple
Name-based resolution. One factory, one instance.
from evoid_di import DIEngine
di = DIEngine()
di.register("db", lambda: create_db("app.db"))
db = di.resolve("db")
Level 2: Scoped
Control instance lifetime per dependency.
di = DIEngine()
# Singleton — one instance for everyone
di.register("db", create_db, scope="singleton")
# Transient — new instance every time
di.register("logger", create_logger, scope="transient")
# Per-user — one instance per user
di.register("session", create_session, scope="per_user")
db = di.resolve("db")
session = di.resolve("session", user_id="user_123")
Level 3: Context-Aware
Route implementations based on Intent level, metadata, or user.
from evoid_di import DIEngine, Rule, RuleSet
di = DIEngine(
rules_config={
"notifier": {
"scope": "singleton",
"default": "memory_notifier",
"rules": [
{"when": {"level": "CRITICAL"}, "then": "email_sender"},
{"when": {"level": "STANDARD"}, "then": "slack_sender"},
],
}
},
implementations={
"memory_notifier": lambda: MemoryNotifier(),
"email_sender": lambda: EmailSender(),
"slack_sender": lambda: SlackSender(),
},
)
notifier = await di.resolve_async("notifier", ctx)
Configuration
TOML
[engines]
di = "di"
[engines.options.di]
rules = {"notifier": {"default": "memory"}}
implementations = {"memory": "my_module:create_notifier"}
API
register_handlers(rules, implementations, services)
Register DI engine as Intent handlers.
DIEngine Methods
| Method | Signature | Description |
|---|---|---|
register |
register(name, factory, scope="singleton") |
Register a factory |
resolve |
resolve(name, user_id=None) |
Synchronous resolve |
resolve_async |
async resolve_async(name, ctx) |
Async resolve with context |
inject |
inject(ctx, service_name, key=None) |
Resolve and inject into ctx.deps |
set_fallback |
set_fallback(name, fallbacks) |
Define fallback chain |
set_health_check |
set_health_check(name, check_fn) |
Register health check |
resolve_with_fallback |
resolve_with_fallback(name) |
Resolve with auto-fallback |
resolve_any |
resolve_any(*names) |
Resolve first available |
set_cluster_registry |
set_cluster_registry(registry) |
Connect to cluster |
has |
has(name) |
Check if service exists |
register_many |
register_many(services) |
Batch registration |
resolve_or_none |
resolve_or_none(name) |
Safe resolve (no exception) |
Scopes
| Scope | Behavior |
|---|---|
singleton |
One instance, shared everywhere |
transient |
New instance on every resolve |
per_user |
One instance per user_id |
Fault Tolerance
from evoid_di import di
# Fallback chain
di.set_fallback("storage.postgresql", ["storage.sqlite", "cache.redis"])
# Health check
di.set_health_check("cache.redis", lambda: redis.ping())
# Auto-fallback (never crashes)
storage = di.resolve_with_fallback("storage.postgresql")
# Tries: postgresql → sqlite → redis → cluster → None
# Resolve first available
cache = di.resolve_any("cache.redis", "cache.memory")
Cluster Integration
from evoid_cluster import ClusterBridge
bridge = ClusterBridge(config)
await bridge.start()
# Connect registry to DI
di.set_cluster_registry(bridge._registry)
# Remote services become fallbacks
storage = di.resolve("storage.postgresql")
# If not local, checks cluster peers
Dependencies
evoid>=0.4.0
Links
License
MIT
Metadata
Release files for evoid-di 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| evoid_di-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for evoid_di-0.2.0-py3-none-any.whl |
Release files / evoid_di-0.2.0-py3-none-any.whl
| Download URL | evoid_di-0.2.0-py3-none-any.whl |
|---|---|
| Size | 11.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dc6cf5e86758014d7c3b3243f91e0f7e218edb36c086829d29519052783feae7
|
|
BLAKE2b-256 checksum How to use checksums |
1d43d2e0e91303aaa3ff3df4ea83885c0431f385de6e8af83787eb020c86f541
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for evoid-di 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.