Skip to content

Add Dependency Injector#879

Closed
rmk135 wants to merge 1 commit intovinta:masterfrom
rmk135:master
Closed

Add Dependency Injector#879
rmk135 wants to merge 1 commit intovinta:masterfrom
rmk135:master

Conversation

@rmk135
Copy link

@rmk135 rmk135 commented Apr 23, 2017

What is this Python project?

Dependency Injector is a dependency injection microframework for Python. It was designed to be unified, developer-friendly tool that helps to implement dependency injection design pattern in formal, pretty, Pythonic way.

Dependency Injector framework key features are:

  • Easy, smart, pythonic style.
  • Obvious, clear structure.
  • Extensibility and flexibility.
  • High performance.
  • Memory efficiency.
  • Thread safety.
  • Documentation.
  • Semantic versioning.

Dependency Injector containers and providers are implemented as C extension types using Cython.

Example code:

"""Example of dependency injection in Python."""

import logging
import sqlite3

import boto3

import example.main
import example.services

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


class Core(containers.DeclarativeContainer):
    """IoC container of core component providers."""

    config = providers.Configuration('config')

    logger = providers.Singleton(logging.Logger, name='example')


class Gateways(containers.DeclarativeContainer):
    """IoC container of gateway (API clients to remote services) providers."""

    database = providers.Singleton(sqlite3.connect, Core.config.database.dsn)

    s3 = providers.Singleton(
        boto3.client, 's3',
        aws_access_key_id=Core.config.aws.access_key_id,
        aws_secret_access_key=Core.config.aws.secret_access_key)


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

    users = providers.Factory(example.services.UsersService,
                              db=Gateways.database,
                              logger=Core.logger)

    auth = providers.Factory(example.services.AuthService,
                             db=Gateways.database,
                             logger=Core.logger,
                             token_ttl=Core.config.auth.token_ttl)

    photos = providers.Factory(example.services.PhotosService,
                               db=Gateways.database,
                               s3=Gateways.s3,
                               logger=Core.logger)


class Application(containers.DeclarativeContainer):
    """IoC container of application component providers."""

    main = providers.Callable(example.main.main,
                              users_service=Services.users,
                              auth_service=Services.auth,
                              photos_service=Services.photos)

For more examples, please, follow https://github.com/ets-labs/python-dependency-injector

What's the difference between this Python project and similar ones?

Enumerate comparisons.

  1. Provides clear and simple structure: Containers -> Providers.
  2. Use Python language features, deeply follow Pythonic style and Zen of Python.
  3. Does NOT provide @inject decorator (or any other way of monkey-patching) that pollutes the code. Instead of this, provides feature of clean overriding of providers.
  4. Very fast, implemented using Cython.

--

Anyone who agrees with this pull request could vote for it by adding a 👍 to it, and usually, the maintainer will merge it when votes reach 20.

@rmk135
Copy link
Author

rmk135 commented May 24, 2017

Hi @vinta,

I'm terribly sorry if I bother you too much, but I really appreciate to get your review on this PR.

Thanks,
Roman

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant