[feat] add di
This commit is contained in:
parent
96af9c08f5
commit
ff6efb958d
2 changed files with 67 additions and 0 deletions
0
adapter/di/__init__.py
Normal file
0
adapter/di/__init__.py
Normal file
67
adapter/di/container.py
Normal file
67
adapter/di/container.py
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
from collections.abc import Mapping
|
||||
from dataclasses import dataclass, field
|
||||
from pathlib import Path
|
||||
|
||||
from adapter.config.loader import load_config
|
||||
from adapter.config.model import AppConfig
|
||||
from adapter.otel.bootstrap import OtelRuntime, setup_otel
|
||||
from repository.user import InMemoryUserRepository
|
||||
from usecase.user import GetUser
|
||||
|
||||
|
||||
@dataclass(frozen=True, slots=True)
|
||||
class AppRepositories:
|
||||
user: InMemoryUserRepository
|
||||
|
||||
|
||||
@dataclass(frozen=True, slots=True)
|
||||
class AppUsecases:
|
||||
get_user: GetUser
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class AppContainer:
|
||||
config: AppConfig
|
||||
observability: OtelRuntime
|
||||
repositories: AppRepositories
|
||||
usecases: AppUsecases
|
||||
_is_shutdown: bool = field(default=False, init=False, repr=False)
|
||||
|
||||
def shutdown(self) -> None:
|
||||
if self._is_shutdown:
|
||||
return
|
||||
|
||||
try:
|
||||
self.observability.shutdown()
|
||||
finally:
|
||||
self._is_shutdown = True
|
||||
|
||||
|
||||
def build_container(
|
||||
config_path: Path | str | None = None,
|
||||
env_path: Path | str | None = None,
|
||||
environ: Mapping[str, str] | None = None,
|
||||
) -> AppContainer:
|
||||
config = load_config(
|
||||
config_path=config_path,
|
||||
env_path=env_path,
|
||||
environ=environ,
|
||||
)
|
||||
observability = setup_otel(config)
|
||||
|
||||
user_repository = InMemoryUserRepository()
|
||||
repositories = AppRepositories(user=user_repository)
|
||||
usecases = AppUsecases(
|
||||
get_user=GetUser(
|
||||
repository=user_repository,
|
||||
logger=observability.logger,
|
||||
tracer=observability.tracer,
|
||||
)
|
||||
)
|
||||
|
||||
return AppContainer(
|
||||
config=config,
|
||||
observability=observability,
|
||||
repositories=repositories,
|
||||
usecases=usecases,
|
||||
)
|
||||
Loading…
Add table
Add a link
Reference in a new issue