Lagom, a type based dependency injection container
Project description
Lagom - Dependency injection container
Usage
Everything in Lagom is based on types. To create an object you pass the type to the container:
container = Container()
some_thing = container[SomeClass]
Defining a singleton
container[SomeExpensiveToCreateClass] = SomeExpensiveToCreateClass("up", "left")
alternatively if you want to defer construction until it's needed:
container[SomeExpensiveToCreateClass] = Singleton(SomeExpensiveToCreateClass)
Defining a type that gets recreated every time
container[SomeClass] = lambda: SomeClass("down", "spiral")
if the type needs things from the container the lambda can take a single argument which is the container:
container[SomeClass] = lambda c: SomeClass(c[SomeOtherDep], "spinning")
Alias a concrete instance to an ABC
container[SomeAbc] = ConcreteClass
Example
App setup
from abc import ABC
from dataclasses import dataclass
from lagom import Container
#--------------------------------------------------------------
# Here is an example of some classes your application may be built from
@dataclass
class DiceApiUrl:
url: str
class RateLimitingConfig:
pass
class DiceClient(ABC):
pass
class HttpDiceClient(DiceClient):
def __init__(self, url: DiceApiUrl, limiting: RateLimitingConfig):
pass
class Game:
def __init__(self, dice_roller: DiceClient):
pass
#--------------------------------------------------------------
# Next we setup some definitions
container = Container()
# We need a specific url
container[DiceApiUrl] = DiceApiUrl("https://roll.diceapi.com")
# Wherever our code wants a DiceClient we get the http one
container[DiceClient] = HttpDiceClient
#--------------------------------------------------------------
# Now the container can build the game object
game = container[Game]
Testing without patching
Taking the container from above we can now swap out
the dice client to a test double/fake. When we get an
instance of the Game
class it will have the new
fake dice client injected in.
def some_test(container: Container):
container[DiceClient] = FakeDice(always_roll=6)
game_to_test = container[Game]
# TODO: act & assert on something
Design Goals
- Everything should be done by type. No reliance on names.
- All domain code should remain unmodified. No special decorators.
- Make use of modern python features (3.7 at the time of creation)
- The API should expose sensible typing (for use in pycharm/mypy)
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
lagom-0.2.0.tar.gz
(14.1 kB
view hashes)
Built Distribution
lagom-0.2.0-py2.py3-none-any.whl
(10.0 kB
view hashes)
Close
Hashes for lagom-0.2.0-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e7637d004de4f703392fd5f0955317c33f0588a213734452c18ef3a6c899f975 |
|
MD5 | 082cb04baff085db2faefd162f9a7cdb |
|
BLAKE2b-256 | 21ee64d67ef0f1ebad3cdadd64e90f9ee57f3aff6f801cf836c98ca8fe1303bf |