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:
139
suixinkan_ios/App/AppFeatureServices.swift
Normal file
139
suixinkan_ios/App/AppFeatureServices.swift
Normal 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) }
|
||||
}
|
||||
Reference in New Issue
Block a user