Skip to main content

Dependency Injection framework with IOC-container and scopes

Project description

"Modern-DI"

Project Badges
common MyPy Strict GitHub stars
modern-di Supported versions downloads
modern-di-fastapi Supported versions downloads
modern-di-litestar Supported versions downloads

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

📚 Documentation

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


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)

Uploaded Source

Built Distribution

modern_di-0.7.0-py3-none-any.whl (12.5 kB view details)

Uploaded Python 3

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

Hashes for modern_di-0.7.0.tar.gz
Algorithm Hash digest
SHA256 20dbfcebe1ec140cfdea9da61fb4f90ba6a7e0a6d556e10fbd9262f201b441d4
MD5 c1f731e657f6ed6bfe854e5331081d41
BLAKE2b-256 b638e39f25001fea3f7857df64e7d4e6ab2968b04c3e0a72b7cea90eec0b06a1

See more details on using hashes here.

File details

Details for the file modern_di-0.7.0-py3-none-any.whl.

File metadata

File hashes

Hashes for modern_di-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 46292ae2dafefbe1d8e0d36e396c3a0c5d6668e17db13b7a231367251f49faa1
MD5 a89231aef36309ebbb3b99bca9ad4c2b
BLAKE2b-256 aa633acfe5af39e736a0f1facb772a667070966cab0e5c154c03e805447acfe7

See more details on using hashes here.

Supported by

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