Skip to main content

Python dependency injection framework

Project description

Dependency Injector is a Python dependency injection framework. It was designed to be unified, developer-friendly tool for managing any kind of Python objects and their dependencies in formal, pretty way.

Dependency Injector framework key features are:

  • Easy, smart, pythonic style.

  • Obvious, clear structure.

  • Extensibility and flexibility.

  • Memory efficiency.

  • Thread safety.

  • Documentation.

  • Semantic versioning.

Status

PyPi

Latest Version License

Python versions and implementations

Supported Python versions Supported Python implementations

Builds and tests coverage

Build Status Coverage Status

Installation

Dependency Injector library is available on PyPi:

pip install dependency_injector

Example

Brief example below demonstrates usage of Dependency Injector containers and providers for definition of several IoC containers for some microservice system that consists from several business and platform services:

"""Example of several Dependency Injector IoC containers."""

import sqlite3
import boto.s3.connection
import example.services

import dependency_injector.containers as containers
import dependency_injector.providers as providers


class Platform(containers.DeclarativeContainer):
    """IoC container of platform service providers."""

    database = providers.Singleton(sqlite3.connect, ':memory:')

    s3 = providers.Singleton(boto.s3.connection.S3Connection,
                             aws_access_key_id='KEY',
                             aws_secret_access_key='SECRET')


class Services(containers.DeclarativeContainer):
    """IoC container of business service providers."""

    users = providers.Factory(example.services.Users,
                              db=Platform.database)

    auth = providers.Factory(example.services.Auth,
                             db=Platform.database,
                             token_ttl=3600)

    photos = providers.Factory(example.services.Photos,
                               db=Platform.database,
                               s3=Platform.s3)

Next example demonstrates usage of @inject decorator with IoC containers defined above:

"""Dependency Injector @inject decorator example."""

import application
import dependency_injector.injections as injections


@injections.inject(users_service=application.Services.users)
@injections.inject(auth_service=application.Services.auth)
@injections.inject(photos_service=application.Services.photos)
def main(users_service, auth_service, photos_service):
    """Main function."""
    user = users_service.get_user('user')
    auth_service.authenticate(user, 'secret')
    photos_service.upload_photo(user['id'], 'photo.jpg')


if __name__ == '__main__':
    main()

Alternative definition styles

Dependecy Injector supports few other styles of dependency injections definition.

IoC containers from previous example could look like these:

class Platform(containers.DeclarativeContainer):
    """IoC container of platform service providers."""

    database = providers.Singleton(sqlite3.connect) \
        .add_args(':memory:')

    s3 = providers.Singleton(boto.s3.connection.S3Connection) \
        .add_kwargs(aws_access_key_id='KEY',
                    aws_secret_access_key='SECRET')


class Services(containers.DeclarativeContainer):
    """IoC container of business service providers."""

    users = providers.Factory(example.services.Users) \
        .add_kwargs(db=Platform.database)

    auth = providers.Factory(example.services.Auth) \
        .add_kwargs(db=Platform.database,
                    token_ttl=3600)

    photos = providers.Factory(example.services.Photos) \
        .add_kwargs(db=Platform.database,
                    s3=Platform.s3)

or like this these:

class Platform(containers.DeclarativeContainer):
    """IoC container of platform service providers."""

    database = providers.Singleton(sqlite3.connect)
    database.add_args(':memory:')

    s3 = providers.Singleton(boto.s3.connection.S3Connection)
    s3.add_kwargs(aws_access_key_id='KEY',
                  aws_secret_access_key='SECRET')


class Services(containers.DeclarativeContainer):
    """IoC container of business service providers."""

    users = providers.Factory(example.services.Users)
    users.add_kwargs(db=Platform.database)

    auth = providers.Factory(example.services.Auth)
    auth.add_kwargs(db=Platform.database,
                    token_ttl=3600)

    photos = providers.Factory(example.services.Photos)
    photos.add_kwargs(db=Platform.database,
                      s3=Platform.s3)

You can get more Dependency Injector examples in /examples directory on GitHub:

https://github.com/ets-labs/python-dependency-injector

Documentation

Dependency Injector documentation is hosted on ReadTheDocs:

Feedback

Feel free to post questions, bugs, feature requests, proposals etc. on Dependency Injector GitHub Issues:

https://github.com/ets-labs/python-dependency-injector/issues

Your feedback is quite important!

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

dependency_injector-2.1.0.tar.gz (17.5 kB view hashes)

Uploaded Source

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