Warning
This document is for an in-development version of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy.di
"""Dependency injection framework for Galaxy-type apps."""
from typing import (
Optional,
Type,
TypeVar,
)
from lagom import Container as LagomContainer
from lagom.exceptions import UnresolvableType
T = TypeVar("T")
[docs]class Container(LagomContainer):
"""Abstraction around lagom to provide a dependency injection context.
Abstractions used by Galaxy should come through this interface so we can swap
out the backend as needed. For instance https://punq.readthedocs.io/en/latest/
containers look very nice and would allow us to also inject by name (e.g. for
config variables for instance).
"""
def _register_singleton(self, dep_type: Type[T], instance: Optional[T] = None) -> T:
if instance is None:
# create an instance from the context and register it as a singleton
instance = self[dep_type]
self[dep_type] = instance
return self[dep_type]
def _register_abstract_singleton(
self, abstract_type: Type[T], concrete_type: Type[T], instance: Optional[T] = None
) -> T:
self[abstract_type] = instance if instance is not None else concrete_type
return self[abstract_type]
[docs] def resolve_or_none(self, dep_type: Type[T]) -> Optional[T]:
"""Resolve the dependent type or just return None.
If resolution is impossible assume caller has a backup plan for
constructing the desired object. Used to construct controllers that
may or may not be resolvable (some have upgraded but legacy framework still
works).
"""
try:
return self[dep_type]
except UnresolvableType:
return None