Skip to main content

Dependency Injection Container for Python 3+. Uses Python 3 annotations to provide hints for the components that should be injected.

Project description

dic

Dependency Injection Container for Python 3+ influenced partially by Autofac. dic aims to be a tiny “out of the way” framework to help realise IoC via dependency injection. dic uses Python 3 annotations to provide hints for the components that should be injected.

version build docs

Documentation

dic documentation is available via Read the Docs.

Install

dic is available via pip:
pip install dic

Features

Currently, dic supports:

  1. Constructor injection for classes

  2. Factory and Lazy relationships

  3. Registration via:
    1. Constructor matching for a registered class

    2. Custom callback

    3. Pre-created instances

  4. Lifetime scopes:
    1. Instance per dependency

    2. Single instance

Quick Example

A quick example on how to use dic:
import dic

class SimpleThing(object):
    def say(self, message):
        print(message)

class RequiresThing(object):
    def __init__(self, thing: SimpleThing):
        self.thing = thing

    def say(self, message):
        self.thing.say(message)

# build the container
builder = dic.container.ContainerBuilder()

builder.register_class(SimpleThing)
builder.register_class(RequiresThing, component_scope=dic.scope.SingleInstance)

container = builder.build()

# use the container

# Note there'll only be one of these due to SingleInstance scoping during build
x = container.resolve(RequiresThing)
x.say("my message")

Relationships

dic supports basic relationships:

  1. dic.rel.Lazy - don’t create the dependency until it’s first used

  2. dic.rel.Factory - the component wants to create other components. Lifetime scopes are respected. Supports custom arguments.

Using a factory:
import dic

class SimpleThing(object):
    def __init__(self, special_argument):
        self.special_argument = special_argument

class BuildsThings(object):
    def __init__(self, thing_factory: dic.rel.Factory(SimpleThing)):
        self.thing_factory = thing_factory

    def build_me_a_thing(self):
        # builds a new thing using the injected factory
        # Note that custom arguments can be provided here
        self.thing_factory(special_argument="My super special argument")

# build the container
builder = dic.container.ContainerBuilder()

builder.register_class(SimpleThing)
builder.register_class(BuildsThing)

container = builder.build()

# use the container

x = container.resolve(BuildsThing)

# use it
thing = x.build_me_a_thing()
# ...

FAQ

  1. Is dic thread-safe?

Yes. dic.rel.Lazy and dic.container.Container.resolve() are thread-safe. As a result, do not store the component_context given to register_callback callbacks, as thread-safety is enforced at the container.resolve() level.

  1. Can I define my own scopes?

Yes. Derive a scope from dic.scope.Scope. Scopes can be used to provide lifetime for a calling thread, for 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

dic-1.5.2b1.tar.gz (7.3 kB view details)

Uploaded Source

File details

Details for the file dic-1.5.2b1.tar.gz.

File metadata

  • Download URL: dic-1.5.2b1.tar.gz
  • Upload date:
  • Size: 7.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for dic-1.5.2b1.tar.gz
Algorithm Hash digest
SHA256 f0d2ce490e5975fe73239a0f7c61f252d204e9986547ea1a75456a0873cc2836
MD5 b3b66ce93a3a285eb94040165771b879
BLAKE2b-256 5e9e0414910d4947e69662c9c10c1ca8c824ad34c85f9402c03998cea8a936c2

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