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>
140 lines
5.3 KiB
Swift
140 lines
5.3 KiB
Swift
//
|
||
// 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) }
|
||
}
|