Skip to content

Dependency Injection (DI)

Dependency Injection is a concrete IoC technique: dependencies are provided from outside the object, typically by a container.

Constructor injection with Clean IoC

from clean_ioc import Container


class Logger:
    def info(self, message: str):
        print(message)


class UserService:
    def __init__(self, logger: Logger):
        self.logger = logger

    def run(self):
        self.logger.info("running")


container = Container()
container.register(Logger)
container.register(UserService)

container.resolve(UserService).run()

Benefits

  • lower coupling
  • easier testing via swapped registrations
  • clear dependency graph
  • lifecycle management through lifespans/scopes

In tests

from clean_ioc import Container


class Logger:
    def info(self, message: str):
        pass


class FakeLogger(Logger):
    def __init__(self):
        self.messages = []

    def info(self, message: str):
        self.messages.append(message)


class Service:
    def __init__(self, logger: Logger):
        self.logger = logger

    def run(self):
        self.logger.info("ok")


container = Container()
container.register(Logger, FakeLogger)
container.register(Service)

service = container.resolve(Service)
service.run()
assert service.logger.messages == ["ok"]