Skip to main content

A simple OOP Dependency injection container

Project description

Intro

Dependency Injection is the key pattern used to implement Inversion of Control and Dependency Inversion principles (check D in SOLID).

It makes it simple to standardize the way objects are initialized in the application.

This package provides you with the set of components to automate dependency injection through the application.

Installation

pip install oop-di

Usage

To make it work do the following steps:

# Init the `ContainerDefinition` component
container_definition = ContainerDefinition()
# fill the service definitions
container_definition.add_service(SomeService)
# compile the container
container = container_definition.compile()

# get an instance of the service from the container ...
service = container.get(SomeService)

# ... or inject it. Kwonly arguments will be injected
@container.inject()
def something(*, service: SomeService):
    ...

something()

# partial injection is also possible
def something_else(*, wont_inject: UnknownService, service: SomeService):
    ...

something_else(wont_inject=UnknownService())

Extensions

EnvExtension

You can add all environment variables to your container by adding EnvExtension to the container definition:

container_definition = ContainerDefinition()
container_definition.add_extension(EnvExtension())

JsonExtension

You can add define parameters/aliases/services in a JSON file. Check examples/s4_json.py for more details.

container_definition = ContainerDefinition()
container_definition.add_extension(JsonExtension(Path(__file__).parent / "config.json"))

Config example:

{
  "parameters": {
    "test1_email": "test@example.com",
    "test2_email": "test2@example.com",
    "test3_email": "test3@example.com"
  },
  "services": {
    "examples.s4_module": [
      {"class": "ProductService"},
      {"class": "Mailer", "name": "m1","tags": ["admin_mailers"], "parameters": {"from_email": "test1_email"}},
      {"class": "Mailer", "name": "m2","tags": ["admin_mailers"], "parameters": {"from_email": "test2_email"}},
      {"class": "Mailer", "name": "m3","tags": ["admin_mailers"], "parameters": {"from_email": "test3_email"}},
      {"class": "MultiMailer", "name": "@examples.s4_module.MailerInterface","parameters": {"mailers": "#admin_mailers"}}
    ]
  }
}

Why not python-dependency-injector?

python-dependency-injector is the most popular Python DI library with a large community, excellent docs, and tons of features that are not available in oop-di. Probably, python-dependency-injector is the best choice for you. I've built this small library to handle the DI of my small experiments/pet projects.

What I don't like in python-dependency-injector and tried to mitigate in this library:

  • it requires a name for every service. oop-di can use class itself as the name of the service;
  • it makes you pollute your function's params with = Provide[Container.service] defaults to inject something. oop-di just auto-wires the services by checking the parameter's types;
  • oop-di has the tagging feature that can gather services into an array without an explicit definition of that array.

Check examples/ folder for more info:

  • s1_simple.py - shows the basics: how to define services and how to inject the services somewhere.
  • s2_extensions.py - how to split the definitions between modules.
  • s3_tags.py, s3_tags2_dict.py - how to use tags to group services (list or dict grouping is possible).
  • s4_json.py - JsonExtension usage example.

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

oop-di-0.3.0.tar.gz (13.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

oop_di-0.3.0-py3-none-any.whl (11.0 kB view details)

Uploaded Python 3

File details

Details for the file oop-di-0.3.0.tar.gz.

File metadata

  • Download URL: oop-di-0.3.0.tar.gz
  • Upload date:
  • Size: 13.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.14

File hashes

Hashes for oop-di-0.3.0.tar.gz
Algorithm Hash digest
SHA256 d552908f0e4f9955d3176349c2b4a0679bf7a6ac7aa5932ed83fa4be02f5eda1
MD5 7a5852966e337cae0a047c1880aad5dc
BLAKE2b-256 35afe09dfa6a0bf3677bd223a3b75384a5e804f19724e04d722c429fc7015b56

See more details on using hashes here.

File details

Details for the file oop_di-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: oop_di-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 11.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.14

File hashes

Hashes for oop_di-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 51079f02f8c8e22217c32be36177515fae8002f98f08f3a4af013b71fafd5329
MD5 da1c83989592285ecd59e673dee05618
BLAKE2b-256 401c4762fbfe0deecbbfa175fa8344f45a00b10037b08d302a13dca016586d50

See more details on using hashes here.

Supported by

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