Injecting container "self"¶
You can inject container "self" into container providers.
fromdependency_injectorimport containers, providers classService: def__init__(self, name: str): self.name = name classServiceDispatcher: def__init__(self, container: containers.Container): self.container = container defget_services(self): for provider in self.container.traverse(types=[providers.Factory]): yield provider() classContainer(containers.DeclarativeContainer): __self__ = providers.Self() service1 = providers.Factory(Service, name="Service 1") service2 = providers.Factory(Service, name="Service 2") service3 = providers.Factory(Service, name="Service 3") dispatcher = providers.Singleton(ServiceDispatcher, __self__) if __name__ == "__main__": container = Container() dispatcher = container.dispatcher() for service in dispatcher.get_services(): print(service.name)
To inject container "self" you need to define Self provider. Container can have only one Self provider.
Usually you will use name __self__.
You can also use different name. When you use different name container will also reference
defined Self provider in .__self__ attribute.
Provider Self is not listed in container .providers attributes.