概述

这是一个关于事务模块与路由权限的办理计划,用于增强在模块化架构场景下,事务模块的健壮性。

  • 经过对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)

总结

咱们的事务向模块化、组件化架构演化的过程中,逐步呈现跨组件调用依靠嵌套,插拔困难等问题。

经过抽象和简化,规划了这个计划,作为后续事务组件化的标准之一。经过剥离事务模块的生命周期,以及一致通讯的方式,能够减缓事务增长带来的代码劣化问题。