Skip to main content

PyPI Python License

evoid-di

Dependency injection engine — Intent Handler system

Quick StartIntent HandlerThree LevelsAPI


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

Release files for evoid-di 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for evoid-di 0.1.2
File Interpreter ABI Platform
evoid_di-0.1.2-py3-none-any.whl Python 3 none any Details

Release files / evoid_di-0.1.2-py3-none-any.whl

Download URL evoid_di-0.1.2-py3-none-any.whl
Size 11.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
47e9080d71aeb916dc2be2dc49dccab7d3ca0682a03c2ca7fb2a71fb8ae6aa05
BLAKE2b-256 checksum
How to use checksums
33e379128cbc9adc34c3872376af726a5cec336da14a6ba06369994c40a26935
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","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}

Release history Release notifications | RSS feed

0.2.0

1 release file

This release

0.1.2 This release

1 release file

0.1.1

1 release file

0.1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page