Bundles
Bundles group related registrations.
A bundle is any callable with signature Callable[[Container], None].
from dataclasses import dataclass
from clean_ioc import Container
from clean_ioc.bundles import OnlyRunOncePerClassBundle
Function bundle
class ClientDependency:
def get_int(self) -> int:
return 10
class Client:
def __init__(self, dep: ClientDependency):
self.dep = dep
def get_number(self) -> int:
return self.dep.get_int()
def client_bundle(c: Container):
c.register(ClientDependency)
c.register(Client)
container = Container()
container.apply_bundle(client_bundle)
client = container.resolve(Client)
print(client.get_number())
Class-based bundle
@dataclass
class ClientConfig:
base_url: str
class ApiClient:
def __init__(self, config: ClientConfig):
self.base_url = config.base_url
class ApiBundle(OnlyRunOncePerClassBundle):
def __init__(self, config: ClientConfig):
self.config = config
def apply(self, c: Container):
c.register(ClientConfig, instance=self.config)
c.register(ApiClient)
container = Container()
cfg = ClientConfig(base_url="https://example.com")
container.apply_bundle(ApiBundle(cfg))
container.apply_bundle(ApiBundle(cfg)) # ignored by OnlyRunOncePerClassBundle
client = container.resolve(ApiClient)
print(client.base_url)