Features:
- types resolution by signature types annotations (type hints)
- types resolution by class annotations (type hints) (new in version 1.1.0 ⭐)
- types resolution by constructor parameter names and aliases (convention over configuration)
- unintrusive: builds objects graph without the need to change classes source code (unlike some other Python implementations of dependency injection, like inject)
- minimum overhead to obtain services, once the objects graph is built
- support for singletons, transient, and scoped services
- compatible with Python 3.10.0a5 (still in development at the time of rodi 1.1.1)
This library is freely inspired by .NET Standard
Microsoft.Extensions.DependencyInjection
implementation (ref. MSDN,
Dependency injection in ASP.NET
Core,
Using dependency injection in a .Net Core console
application).
pip install rodi
This library is designed to work both by type hints in constructor signatures, and by constructor parameter names (convention over configuration), like described in below diagram. It can be useful for those who like type hinting, those who don't, and those who like having both options.
rodi
works by inspecting __init__ methods once at
runtime, to generate functions that return instances of desired types.
Validation steps, for example to detect circular dependencies or missing
services, are done when building these functions, so additional validation is
not needed when activating services.
For this reason, services are first registered inside an instance of Container class, which implements a method build_provider() that returns an instance of Services. The service provider is then used to obtain desired services by type or name. Inspection and validation steps are done only when creating an instance of service provider.
In the example below, a singleton is registered by exact instance.
container = Container()
container.add_instance(Cat("Celine"))
services = container.build_provider() # --> validation, generation of functions
cat = services.get(Cat)
assert cat is not None
assert cat.name == "Celine"
- singleton - instantiated only once per service provider
- transient - services are instantiated every time they are required
- scoped - instantiated only once per service resolution (root call, e.g. once per web request)
rodi
is used in the BlackSheep web
framework to implement dependency
injection for
request handlers.
For documentation and examples, please refer to the wiki in GitHub, https://github.com/Neoteroi/rodi/wiki.