Skip to main content

Dependency injection container for Python3

Project description

pyInjection

pyInjector is a .Net style dependency injection container built for Python3 and utilising the typing module.

  • Register type, instance and lambda functions against a base type for constructor injecting.
  • Supports ABC base types and mock interfaces.
  • Validates container for duplicate registrations, missing registrations and inconsistent scope registrations at runtime.

Table of Contents

  1. Class Setup (for Injectables)
  2. Constructor Setup (for accepting Injectables)
  3. Registration 3.1. Type Registration 3.2. Instance Registration 3.3. Lambda Registration (for decorators)
  4. Resolving 4.1. Lambda Registration with a Resolve 4.2. Resolve for application execution
  5. Validation

Class Setup (for Injectables)

In order for pyInjection to register and inject a class into a constructor, classes must extend a base class. This class can be an abstract class (using ABC) or a mock interface:

from abc import ABC, abstractmethod

class IFoo(ABC):
    @abstractmethod
    def do_something(self) -> None:
	    pass

or

class IFoo:
	def do_something(self) -> None:
		pass

Constructor Setup (for accepting Injectables)

In order for pyInjection to inject objects into class constructors, the constructor must be decorated with @Container.inject:

from pjInjection import Container

class Bar:
	__foo: IFoo

	@Container.inject
	def __init__(self, foo: IFoo):
		self.__foo = foo

	def run(self) -> None:
		self.__foo.do_something()

Registration

pyInjection supports 3 types of injectable registration across both transient and singleton lifetimes.

from pyInjection import Container

Container.add_transient(interface= IFoo, implementation= Foo)
Container.add_singleton(interface= IBar, implementation= Bar)

Container registrations (like in .Net) maps an implementation to the interface base within supported constructors.

Type Registration:

Container.add_transient(interface= IFoo, implementation= Foo)

Instance Registration:

# Note this is registered as transient but will be resolved as a singleton
Container.add_transient(interface= IFoo, implementation= Foo())

Lambda Registration (for decorators):

Container.add_transient(interface= IFoo, implementation= lambda: Foo())

Resolving

In some cases you may wish to resolve an instance from the container (for a lambda function or running the application).

Lambda Registration with a Resolve

...

Container.add_transient(interface= IFoo, implementation= Foo)
Container.add_transient(
    interface= IBar,
    implementation= lambda: Bar(foo= Container.resolve(interface= IFoo)
)

Resolve for application execution

...

Container.add_singleton(interface= IFoo, implementation= Foo)
Container.add_singleton(interface= IBar, implementation= Bar)

bar: IBar = Container.resolve(interface= IBar)
bar.run()

Validation

In order to ensure that the container has been configured correctly and has everything necessary to build all injectable dependencies run the validate method in the composition root:

...

Container.validate()

Any issues found within the container will be raised as an Exception. Exceptions will be raised for the following:

  • Duplicate registrations
  • Missing registrations
  • Type registrations for constructors with primitive types (these should be an instance registration)

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

pyinjection-2.1.tar.gz (9.2 kB view details)

Uploaded Source

Built Distribution

pyInjection-2.1-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file pyinjection-2.1.tar.gz.

File metadata

  • Download URL: pyinjection-2.1.tar.gz
  • Upload date:
  • Size: 9.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyinjection-2.1.tar.gz
Algorithm Hash digest
SHA256 89a7a94990c38d88d1757fd2e44a3d76127b38f162f48bc23144bc50fc2061a2
MD5 eb187f5fff8b1842da931bda72923e48
BLAKE2b-256 394d04f562ee98b522dc05806efe400688076c42043895a251f001a109234284

See more details on using hashes here.

File details

Details for the file pyInjection-2.1-py3-none-any.whl.

File metadata

  • Download URL: pyInjection-2.1-py3-none-any.whl
  • Upload date:
  • Size: 13.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyInjection-2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9ba465a997327f44affea3bc5f0af8a39a3ddcdd8fcd2a114d3a3788f2d7cc27
MD5 5e1a25243077c2c5a0bd175148a58c82
BLAKE2b-256 691433fad04f00d03aa81f749e7d701e31925edd9cf4c302e3299dabeaa3a80b

See more details on using hashes here.

Supported by

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