Skip to main content

.NET Core Dependency Injection for Python

Project description

WD-DI

.NET Style Dependency Injection for Python

PyPI Version Python Version CI Status License Built by white duck LinkedIn Bluesky

WD-DI brings the robust and flexible dependency injection patterns of .NET to your Python applications, with no external library dependencies, just Python's standard library.

Full documentation can be found at https://whiteducksoftware.github.io/wd-di/ (or in the /docs directory).

For beginners, the Core Concepts and Tutorials sections in the documentation are a great place to start to understand not just how to use DI, but why it's beneficial!


Why WD-DI? 🤔

  • Simplified Dependency Management: Effortlessly manage object creation and lifecycles.
  • Enhanced Testability: Easily mock dependencies for robust unit tests.
  • Modular Architecture: Build loosely coupled, maintainable, and scalable applications.
  • Familiar Patterns: Leverage .NET-inspired DI concepts like service lifetimes (Singleton, Scoped, Transient), constructor injection, and the Options pattern for configuration.
  • Pythonic and Lightweight: Clean, intuitive API that integrates smoothly into your Python projects.
✅ Feature WD-DI Typical alternatives
Pure-stdlib (zero runtime deps) ✘ pull in pydantic / C-extensions
.NET-style lifetimes
Transient • Singleton • Scoped (+ auto-dispose)
✘ Scoped rarely supported
Strongly-typed Options binding from dict/JSON/env → dataclass ✘ Dicts or manual parsing
Decorator Pattern Built-in "wrap this service with that decorator" API? ✘ Only by manual implementation
Middleware pipeline bundled & DI-aware (async-first) ✘ None ship a generic pipeline
Decorator-based registration tied to your ServiceCollection (no globals) ✘ Global singletons or meta-classes
Thread-safe circular-dependency detection via ContextVar ✘ Simple set → race-prone
Full IDE type inference for get_service() ✘ Returns Any / needs cast()
Lean & readable (~1.4 k LOC + robust test suite) ✘ wtf am I reading

Installation 📦

pip install wd-di

Quick Example: The Power of WD-DI 🚀

Experience clean, decoupled code with intuitive type-hinted dependency resolution:

from wd.di import ServiceCollection

services = ServiceCollection()

# Define interfaces and implementations
class IEmailService:
    def send_email(self, to: str, subject: str, body: str) -> None:
        pass

class EmailService(IEmailService):
    def send_email(self, to: str, subject: str, body: str) -> None:
        print(f"\nSending email to {to}")
        print(f"Subject: {subject}")
        print(f"Body: {body}")
        print("Email sent successfully\n")

# UserService depends on IEmailService
class UserService:
    def __init__(self, email_service: IEmailService):
        self.email_service = email_service

    def notify_user(self, user_id: str, message: str) -> None:
        self.email_service.send_email(f"user{user_id}@example.com", "Notification", message)

# Register services
services.add_singleton(IEmailService, EmailService)
services.add_singleton(UserService)

# Build provider
# Services will be resolved and injected into services 
# like EmailService into UserService
provider = services.build_service_provider()

# Get services with proper type hints
email_service = provider.get_service(IEmailService)
user_service = provider.get_service(UserService)

# IDE will provide code completion for these methods
# No need to cast or use Any
email_service.send_email("test@example.com", "Test", "Hello")
user_service.notify_user("123", "Welcome!")

Dive into the full documentation to explore service lifetimes, configuration, middleware, and more!


Contributing 🤝

Contributions are welcome! Please see the main documentation site for details on how to contribute, report issues, or request features.


License 📜

This project is licensed under the MIT License. See the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wd_di-0.2.13.tar.gz (1.0 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wd_di-0.2.13-py3-none-any.whl (18.9 kB view details)

Uploaded Python 3

File details

Details for the file wd_di-0.2.13.tar.gz.

File metadata

  • Download URL: wd_di-0.2.13.tar.gz
  • Upload date:
  • Size: 1.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.4

File hashes

Hashes for wd_di-0.2.13.tar.gz
Algorithm Hash digest
SHA256 d06f440bc12806431b201e6b3a81179d131904867d8b777a4b08856cd7ddafe4
MD5 360b9c54137e251a0af3405ef4800b11
BLAKE2b-256 5a0de9245b367165e08a728343b2e916fe9d955961605a5a5e917ff9e9040c27

See more details on using hashes here.

File details

Details for the file wd_di-0.2.13-py3-none-any.whl.

File metadata

  • Download URL: wd_di-0.2.13-py3-none-any.whl
  • Upload date:
  • Size: 18.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.4

File hashes

Hashes for wd_di-0.2.13-py3-none-any.whl
Algorithm Hash digest
SHA256 95f04c087b4cea47997f8e79844d5a69a14e8e76b716df05bfa7dab6c43cdb5f
MD5 6d14e9ddbe15f5b73b6fad680238ff52
BLAKE2b-256 865d6f0529442344e83590c4f5a98c4fec41f11f961c03d2b1f666a3dd6c67af

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page