Refactor AppServices into assembly, feature facades, and lifecycle coordinator.

Extract dependency wiring and session lifecycle from the container and RootViewController, split NetworkBundle by domain, and add module-level feature services while keeping flat accessors for compatibility.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-29 09:32:44 +08:00
parent 1a6d4a1791
commit 0d8f97417b
11 changed files with 686 additions and 197 deletions

View File

@ -0,0 +1,139 @@
//
// AppFeatureServices.swift
// suixinkan
//
// Created by Codex on 2026/6/29.
//
import Foundation
@MainActor
/// API
struct OrdersFeatureServices {
private let services: AppServices
///
init(services: AppServices) {
self.services = services
}
var api: OrdersAPI { services.ordersAPI }
var currentScenicId: Int? { services.currentScenicId }
var currentStoreId: Int? { services.accountContext.currentStore?.id }
var currentRoleId: Int? { services.permissionContext.currentRole?.id }
var navigator: AppNavigator { services.appNavigator }
var toastCenter: ToastCenter { services.toastCenter }
var globalLoading: GlobalLoadingCenter { services.globalLoading }
}
@MainActor
/// 退
struct ProfileFeatureServices {
private let services: AppServices
///
init(services: AppServices) {
self.services = services
}
var authAPI: AuthAPI { services.authAPI }
var profileAPI: ProfileAPI { services.profileAPI }
var accountContextAPI: AccountContextAPI { services.accountContextAPI }
var uploader: OSSUploadService { services.ossUploadService }
var appSession: AppSession { services.appSession }
var accountContext: AccountContext { services.accountContext }
var permissionContext: PermissionContext { services.permissionContext }
var scenicSpotContext: ScenicSpotContext { services.scenicSpotContext }
var authSessionCoordinator: AuthSessionCoordinator { services.authSessionCoordinator }
var currentScenicId: Int? { services.currentScenicId }
var navigator: AppNavigator { services.appNavigator }
var toastCenter: ToastCenter { services.toastCenter }
var globalLoading: GlobalLoadingCenter { services.globalLoading }
/// 退
func logout() {
authSessionCoordinator.logout(
appSession: appSession,
accountContext: accountContext,
permissionContext: permissionContext,
scenicSpotContext: scenicSpotContext,
appNavigator: navigator,
toastCenter: toastCenter
)
services.scenicQueueRuntime.stop()
}
}
@MainActor
///
struct HomeFeatureServices {
private let services: AppServices
///
init(services: AppServices) {
self.services = services
}
var accountContext: AccountContext { services.accountContext }
var permissionContext: PermissionContext { services.permissionContext }
var commonMenuStore: HomeCommonMenuStore { HomeCommonMenuStore() }
var navigator: AppNavigator { services.appNavigator }
var toastCenter: ToastCenter { services.toastCenter }
}
@MainActor
/// API
struct AssetsFeatureServices {
private let services: AppServices
///
init(services: AppServices) {
self.services = services
}
var api: AssetsAPI { services.assetsAPI }
var uploader: OSSUploadService { services.ossUploadService }
var currentScenicId: Int? { services.currentScenicId }
var transferStore: CloudTransferStore { CloudTransferStore.shared }
var toastCenter: ToastCenter { services.toastCenter }
var globalLoading: GlobalLoadingCenter { services.globalLoading }
}
@MainActor
/// API
struct QueueFeatureServices {
private let services: AppServices
///
init(services: AppServices) {
self.services = services
}
var api: ScenicQueueAPI { services.scenicQueueAPI }
var currentScenicId: Int? { services.currentScenicId }
var userId: String? { services.userId }
var scenicSpotContext: ScenicSpotContext { services.scenicSpotContext }
var runtime: ScenicQueueRuntime { ScenicQueueRuntime.shared }
var toastCenter: ToastCenter { services.toastCenter }
var globalLoading: GlobalLoadingCenter { services.globalLoading }
/// 使 App
func updateRuntime(scenePhase: AppScenePhase) {
runtime.update(
api: api,
userId: userId,
scenicId: currentScenicId,
scenePhase: scenePhase
)
}
}
@MainActor
/// `AppServices` 访
extension AppServices {
var ordersFeatureServices: OrdersFeatureServices { OrdersFeatureServices(services: self) }
var profileFeatureServices: ProfileFeatureServices { ProfileFeatureServices(services: self) }
var homeFeatureServices: HomeFeatureServices { HomeFeatureServices(services: self) }
var assetsFeatureServices: AssetsFeatureServices { AssetsFeatureServices(services: self) }
var queueFeatureServices: QueueFeatureServices { QueueFeatureServices(services: self) }
}