概述
这是一个关于事务模块与路由权限的办理计划,用于增强在模块化架构场景下,事务模块的健壮性。
- 经过对App生命周期的转发,来解除App入口与事务模块办理逻辑的耦合。
- 经过协议来办理API路由,经过注册制完成API的服务发现。
事务模块
重新组织后,事务模块的办理睬变得松散,简单完成插拔复用。
协议
publicprotocolSpaceportModuleProtocol{
varloaded:Bool{getset}
/// 决议模块的加载次序,数字越大,优先级越高
/// - Returns: 默认优先级为1000
staticfuncmodulePriority()->Int
/// 加载
funcloadModule()
/// 卸载
funcunloadModule()
/// UIApplicationDidFinishLaunching
funcapplicationDidFinishLaunching(notification:Notification)
/// UIApplicationWillResignActive
funcapplicationWillResignActive(notification:Notification)
/// UIApplicationDidBecomeActive
funcapplicationDidBecomeActive(notification:Notification)
/// UIApplicationDidEnterBackground
funcapplicationDidEnterBackground(notification:Notification)
/// UIApplicationWillEnterForeground
funcapplicationWillEnterForeground(notification:Notification)
/// UIApplicationWillTerminate
funcapplicationWillTerminate(notification:Notification)
}
特性
- 完成模块加载/卸载保护,模块只会加载/卸载一次。
- 同一个模块的注册是替换制,新模块会替代旧模块。
- 供给模块优先级装备,优先级高的模块会更早加载并呼应Application的生命周期回调。
最佳实践
@UIApplicationMain
classAppDelegate:UIResponder,UIApplicationDelegate{
varwindow:UIWindow?
funcapplication(_application:UIApplication,didFinishLaunchingWithOptionslaunchOptions:[UIApplication.LaunchOptionsKey:Any]?)->Bool{
setupModules()
// ......
returntrue
}
funcsetupModules(){
varmodules:[SpaceportModuleProtocol]=[
LoggerModule(), // 4000
NetworkModule(), // 3000
FirebaseModule(), // 2995
RouterModule(), // 2960
DynamicLinkModule(), // 2950
UserEventRecordModule(), // 2900
AppConfigModule(), // 2895
MediaModule(), // 2800
AdModule(), // 2750
PurchaseModule(), // 2700
AppearanceModule(), // 2600
AppstoreModule(), // 2500
MLModule() // 2500
]
#ifDEBUG
modules.append(DebugModule())// 2999
#endif
Spaceport.shared.registerModules(modules)
Spaceport.shared.enableAllModules()
}
}
协议路由
经过路由的协议化办理,完成模块/组件之间通讯的权限办理。
-
服务方
经过Router Manger注册API协议,能够根据场景供给不同的协议版本。
-
事务方
经过Router Manager发现并运用API协议。
最佳实践
完成API协议
protocolResultVCRouterAPI{
@MainActorfuncvc(from:ResultVCFromType,project:Project)throws->ResultVC
@MainActorfuncvcFromPreview(serviceType:EnhanceServiceType,originalImage:UIImage,enhancedImage:UIImage)asyncthrows->ResultVC
}
classResultVCRouter:ResultVCRouterAPI{
@MainActorfuncvc(from:ResultVCFromType,project:Project)throws->ResultVC{
letvc=ResultVC()
vc.modalPresentationStyle=.overCurrentContext
tryvc.vm.config(project:project)
vc.vm.fromType=from
returnvc
}
@MainActorfuncvcFromPreview(serviceType:EnhanceServiceType,originalImage:UIImage,enhancedImage:UIImage)asyncthrows->ResultVC{
letvc=ResultVC()
vc.modalPresentationStyle=.overCurrentContext
tryawaitvc.vm.config(serviceType:serviceType,originalImage:originalImage,enhancedImage:enhancedImage)
returnvc
}
}
注册API协议
publicclassRouterManager:SpaceportRouterService{
publicstaticletshared=RouterManager()
privateoverrideinit(){}
staticfuncAPI<T>(_key:TypeKey<T>)->T?{
returnshared.getRouter(key)
}
}
classRouterModule:SpaceportModuleProtocol{
varloaded=false
staticfuncmodulePriority()->Int{return2960}
funcloadModule(){
// 注册API
RouterManager.shared.register(TypeKey(ResultVCRouterAPI.self),router:ResultVC())
}
funcunloadModule(){}
}
运用协议
// 经过 RouterManager 获取可用API
guardletapi=RouterManager.API(TypeKey(ResultVCRouterAPI.self))else{return}
letvc=tryawaitapi.vcFromPreview(serviceType:.colorize,originalImage:originalImage,enhancedImage:enhancedImage)
self.present(vc,animated:false)
总结
咱们的事务向模块化、组件化架构演化的过程中,逐步呈现跨组件调用依靠嵌套,插拔困难等问题。
经过抽象和简化,规划了这个计划,作为后续事务组件化的标准之一。经过剥离事务模块的生命周期,以及一致通讯的方式,能够减缓事务增长带来的代码劣化问题。