Files
xiaobaifupan/next/backend/bootstrap/container.py
T

105 lines
4.0 KiB
Python

from __future__ import annotations
from dataclasses import dataclass
from backend.bootstrap.settings import Settings
from backend.data.gateway import DataGateway
from backend.data.policy import DataSourcePolicy
from backend.data.providers import EastmoneyProvider, IfindProvider, TushareProvider
from backend.data.repository import MarketRepository
from backend.database.connection import Database
from backend.database.repositories.status import DatabaseStatusRepository
from backend.features.accounts.credentials import SystemCredentialService
from backend.features.accounts.model_pool import ModelPoolRepository, ModelPoolService
from backend.features.accounts.repository import AccountRepository, SystemCredentialRepository
from backend.features.accounts.service import (
AccountService,
MembershipService,
)
from backend.features.market import MarketService
from backend.features.market.insights import MarketInsightService
from backend.features.market.sync import MarketSnapshotService
from backend.features.mentor.context import MentorContextBuilder
from backend.features.mentor.repository import MentorRepository
from backend.features.mentor.service import MentorService
from backend.features.mentor.skills import MentorSkillRegistry
from backend.features.screener.repository import ScreenerRepository
from backend.features.screener.service import ScreenerService
from backend.llm import LLMGateway
from backend.llm.repository import LLMRepository
from backend.security import PasswordHasher, load_or_create_cipher
@dataclass(frozen=True, slots=True)
class ApplicationContainer:
settings: Settings
database: Database
database_status: DatabaseStatusRepository
accounts: AccountService
memberships: MembershipService
system_credentials: SystemCredentialService
model_pool: ModelPoolService
market: MarketService
screener: ScreenerService
llm: LLMGateway
mentor: MentorService
def build_container(settings: Settings) -> ApplicationContainer:
database = Database(settings.database_path)
account_repository = AccountRepository()
credential_repository = SystemCredentialRepository()
model_pool_repository = ModelPoolRepository()
screener_repository = ScreenerRepository()
cipher = load_or_create_cipher(settings)
credentials = SystemCredentialService(database, credential_repository, cipher)
tushare = TushareProvider(lambda: credentials.get("tushare_token"))
market_repository = MarketRepository()
gateway = DataGateway(
database,
market_repository,
(
tushare,
IfindProvider(
lambda: credentials.get("ifind_refresh_token"),
lambda: credentials.get("ifind_access_token"),
),
EastmoneyProvider(),
),
DataSourcePolicy(),
)
market = MarketService(
gateway,
MarketSnapshotService(database, market_repository, gateway),
MarketInsightService(database, market_repository, gateway),
)
accounts = AccountService(database, account_repository, PasswordHasher(), cipher)
memberships = MembershipService(database, account_repository)
model_pool = ModelPoolService(database, model_pool_repository, cipher)
screener = ScreenerService(database, screener_repository, market_repository, gateway)
llm = LLMGateway(database, LLMRepository(), memberships, model_pool)
mentor = MentorService(
database,
MentorRepository(),
MentorSkillRegistry(
settings.mentor_skills_directory,
settings.private_mentor_skills_directory,
),
MentorContextBuilder(database, market_repository, screener_repository, gateway),
gateway,
llm,
)
return ApplicationContainer(
settings=settings,
database=database,
database_status=DatabaseStatusRepository(database),
accounts=accounts,
memberships=memberships,
system_credentials=credentials,
model_pool=model_pool,
market=market,
screener=screener,
llm=llm,
mentor=mentor,
)