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

@ -27,61 +27,130 @@ struct AppContextBundle {
/// `APIClient` token
struct NetworkBundle {
let apiClient: APIClient
let account: AccountNetworkBundle
let commerce: CommerceNetworkBundle
let operation: OperationNetworkBundle
let content: ContentNetworkBundle
var authAPI: AuthAPI { account.authAPI }
var profileAPI: ProfileAPI { account.profileAPI }
var accountContextAPI: AccountContextAPI { account.accountContextAPI }
var pushAPI: PushAPI { account.pushAPI }
var ordersAPI: OrdersAPI { commerce.ordersAPI }
var paymentAPI: PaymentAPI { commerce.paymentAPI }
var walletAPI: WalletAPI { commerce.walletAPI }
var inviteAPI: InviteAPI { commerce.inviteAPI }
var scenicSettlementAPI: ScenicSettlementAPI { commerce.scenicSettlementAPI }
var statisticsAPI: StatisticsAPI { operation.statisticsAPI }
var scenicPermissionAPI: ScenicPermissionAPI { operation.scenicPermissionAPI }
var scenicQueueAPI: ScenicQueueAPI { operation.scenicQueueAPI }
var operatingAreaAPI: OperatingAreaAPI { operation.operatingAreaAPI }
var pilotCertificationAPI: PilotCertificationAPI { operation.pilotCertificationAPI }
var taskAPI: TaskAPI { operation.taskAPI }
var scheduleAPI: ScheduleAPI { operation.scheduleAPI }
var punchPointAPI: PunchPointAPI { operation.punchPointAPI }
var locationReportAPI: LocationReportAPI { operation.locationReportAPI }
var uploadAPI: UploadAPI { content.uploadAPI }
var ossUploadService: OSSUploadService { content.ossUploadService }
var messageCenterAPI: MessageCenterAPI { content.messageCenterAPI }
var liveAPI: LiveAPI { content.liveAPI }
var projectAPI: ProjectAPI { content.projectAPI }
var assetsAPI: AssetsAPI { content.assetsAPI }
/// `APIClient` API
init(apiClient: APIClient) {
self.apiClient = apiClient
account = AccountNetworkBundle(apiClient: apiClient)
commerce = CommerceNetworkBundle(apiClient: apiClient)
operation = OperationNetworkBundle(apiClient: apiClient)
content = ContentNetworkBundle(apiClient: apiClient)
}
}
@MainActor
///
struct AccountNetworkBundle {
let authAPI: AuthAPI
let profileAPI: ProfileAPI
let uploadAPI: UploadAPI
let ossUploadService: OSSUploadService
let accountContextAPI: AccountContextAPI
let pushAPI: PushAPI
/// `APIClient`
init(apiClient: APIClient) {
authAPI = AuthAPI(client: apiClient)
profileAPI = ProfileAPI(client: apiClient)
accountContextAPI = AccountContextAPI(client: apiClient)
pushAPI = PushAPI(client: apiClient)
}
}
@MainActor
///
struct CommerceNetworkBundle {
let ordersAPI: OrdersAPI
let statisticsAPI: StatisticsAPI
let paymentAPI: PaymentAPI
let walletAPI: WalletAPI
let pushAPI: PushAPI
let scenicPermissionAPI: ScenicPermissionAPI
let inviteAPI: InviteAPI
let scenicSettlementAPI: ScenicSettlementAPI
let messageCenterAPI: MessageCenterAPI
/// `APIClient`
init(apiClient: APIClient) {
ordersAPI = OrdersAPI(client: apiClient)
paymentAPI = PaymentAPI(client: apiClient)
walletAPI = WalletAPI(client: apiClient)
inviteAPI = InviteAPI(client: apiClient)
scenicSettlementAPI = ScenicSettlementAPI(client: apiClient)
}
}
@MainActor
///
struct OperationNetworkBundle {
let statisticsAPI: StatisticsAPI
let scenicPermissionAPI: ScenicPermissionAPI
let scenicQueueAPI: ScenicQueueAPI
let liveAPI: LiveAPI
let operatingAreaAPI: OperatingAreaAPI
let pilotCertificationAPI: PilotCertificationAPI
let taskAPI: TaskAPI
let projectAPI: ProjectAPI
let scheduleAPI: ScheduleAPI
let inviteAPI: InviteAPI
let assetsAPI: AssetsAPI
let punchPointAPI: PunchPointAPI
let locationReportAPI: LocationReportAPI
/// `APIClient` API
/// `APIClient`
init(apiClient: APIClient) {
self.apiClient = apiClient
authAPI = AuthAPI(client: apiClient)
profileAPI = ProfileAPI(client: apiClient)
uploadAPI = UploadAPI(client: apiClient)
ossUploadService = OSSUploadService(configService: uploadAPI)
accountContextAPI = AccountContextAPI(client: apiClient)
ordersAPI = OrdersAPI(client: apiClient)
statisticsAPI = StatisticsAPI(client: apiClient)
paymentAPI = PaymentAPI(client: apiClient)
walletAPI = WalletAPI(client: apiClient)
pushAPI = PushAPI(client: apiClient)
scenicPermissionAPI = ScenicPermissionAPI(client: apiClient)
scenicSettlementAPI = ScenicSettlementAPI(client: apiClient)
messageCenterAPI = MessageCenterAPI(client: apiClient)
scenicQueueAPI = ScenicQueueAPI(client: apiClient)
liveAPI = LiveAPI(client: apiClient)
operatingAreaAPI = OperatingAreaAPI(client: apiClient)
pilotCertificationAPI = PilotCertificationAPI(client: apiClient)
taskAPI = TaskAPI(client: apiClient)
projectAPI = ProjectAPI(client: apiClient)
scheduleAPI = ScheduleAPI(client: apiClient)
inviteAPI = InviteAPI(client: apiClient)
assetsAPI = AssetsAPI(client: apiClient)
punchPointAPI = PunchPointAPI(client: apiClient)
locationReportAPI = LocationReportAPI(client: apiClient)
}
}
@MainActor
///
struct ContentNetworkBundle {
let uploadAPI: UploadAPI
let ossUploadService: OSSUploadService
let messageCenterAPI: MessageCenterAPI
let liveAPI: LiveAPI
let projectAPI: ProjectAPI
let assetsAPI: AssetsAPI
/// `APIClient`
init(apiClient: APIClient) {
uploadAPI = UploadAPI(client: apiClient)
ossUploadService = OSSUploadService(configService: uploadAPI)
messageCenterAPI = MessageCenterAPI(client: apiClient)
liveAPI = LiveAPI(client: apiClient)
projectAPI = ProjectAPI(client: apiClient)
assetsAPI = AssetsAPI(client: apiClient)
}
}
@MainActor
/// UI ToastLoading
struct UIFeedbackBundle {