Dependency Injection framework with IOC-container and scopes
Project description
"Modern-DI"
Project | Badges |
---|---|
common | |
modern-di | |
modern-di-fastapi | |
modern-di-litestar |
Dependency injection framework for Python inspired by dependency-injector
and dishka
.
It is in development state yet and gives you the following:
- DI framework with IOC-container and scopes.
- Async and sync resolving.
- Python 3.10-3.13 support.
- Full coverage by types annotations (mypy in strict mode).
- Overriding dependencies for tests.
- Package with zero dependencies.
- Integration with FastAPI and LiteStar
Describe resources and classes:
import dataclasses
import logging
import typing
logger = logging.getLogger(__name__)
# singleton provider with finalization
def create_sync_resource() -> typing.Iterator[str]:
logger.debug("Resource initiated")
try:
yield "sync resource"
finally:
logger.debug("Resource destructed")
# same, but async
async def create_async_resource() -> typing.AsyncIterator[str]:
logger.debug("Async resource initiated")
try:
yield "async resource"
finally:
logger.debug("Async resource destructed")
@dataclasses.dataclass(kw_only=True, slots=True)
class DependentFactory:
sync_resource: str
async_resource: str
Describe dependencies graph (IoC-container)
from modern_di import BaseGraph, Scope, providers
class Dependencies(BaseGraph):
sync_resource = providers.Resource(Scope.APP, create_sync_resource)
async_resource = providers.Resource(Scope.APP, create_async_resource)
simple_factory = providers.Factory(Scope.REQUEST, SimpleFactory, dep1="text", dep2=123)
dependent_factory = providers.Factory(
Scope.REQUEST,
sync_resource=sync_resource,
async_resource=async_resource,
)
Create container and resolve dependencies in your code
from modern_di import Container, Scope
# init container of app scope in sync mode
with Container(scope=Scope.APP) as app_container:
# resolve sync resource
Dependencies.sync_resource.sync_resolve(app_container)
# init container of app scope in async mode
async with Container(scope=Scope.APP) as app_container:
# resolve async resource
await Dependencies.async_resource.async_resolve(app_container)
# resolve sync resource
instance1 = await Dependencies.sync_resource.async_resolve(app_container)
instance2 = Dependencies.sync_resource.sync_resolve(app_container)
assert instance1 is instance2
# create container of request scope
async with app_container.build_child_container(scope=Scope.REQUEST) as request_container:
# resolve factories of request scope
Dependencies.simple_factory.sync_resolve(request_container)
await Dependencies.dependent_factory.async_resolve(request_container)
# resources of app-scope also can be resolved here
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
modern_di-0.7.0.tar.gz
(6.3 kB
view details)
Built Distribution
modern_di-0.7.0-py3-none-any.whl
(12.5 kB
view details)
File details
Details for the file modern_di-0.7.0.tar.gz
.
File metadata
- Download URL: modern_di-0.7.0.tar.gz
- Upload date:
- Size: 6.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 20dbfcebe1ec140cfdea9da61fb4f90ba6a7e0a6d556e10fbd9262f201b441d4 |
|
MD5 | c1f731e657f6ed6bfe854e5331081d41 |
|
BLAKE2b-256 | b638e39f25001fea3f7857df64e7d4e6ab2968b04c3e0a72b7cea90eec0b06a1 |
File details
Details for the file modern_di-0.7.0-py3-none-any.whl
.
File metadata
- Download URL: modern_di-0.7.0-py3-none-any.whl
- Upload date:
- Size: 12.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 46292ae2dafefbe1d8e0d36e396c3a0c5d6668e17db13b7a231367251f49faa1 |
|
MD5 | a89231aef36309ebbb3b99bca9ad4c2b |
|
BLAKE2b-256 | aa633acfe5af39e736a0f1facb772a667070966cab0e5c154c03e805447acfe7 |