Skip to content

Commit 931afdc

Browse files
committed
commit: update
1 parent 4d27fd3 commit 931afdc

File tree

8 files changed

+38
-32
lines changed

8 files changed

+38
-32
lines changed

Example/ModuleRouteExample/AppDelegate.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
1313

1414
private var navigator: MRNavigator = MRNavigator()
1515

16+
1617
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
1718
setupRoute()
1819
return true

Example/ModuleRouteExample/Chat/ChatModule.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ protocol ChatInterface: MRModuleInterface {
1212

1313
}
1414

15-
class ChatModule: MRModule {
15+
class ChatModule: ChatInterface {
1616
static var supportedRoutes: [MRRoute.Type] = [
1717
ChatRoute.self
1818
]

Example/ModuleRouteExample/Detail/DetailModule.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ protocol DetailInterface: MRModuleInterface {
1313

1414
}
1515

16-
class DetailModule: MRModule {
16+
class DetailModule: DetailInterface {
1717

1818
static var supportedRoutes: [MRRoute.Type] = [
1919
DetailRoute.self
@@ -23,7 +23,7 @@ class DetailModule: MRModule {
2323
public init() {}
2424

2525
public func handle(route: MRRoute) -> RouteResult {
26-
// 根据具体路由做出响应
26+
2727
switch route {
2828
case is DetailRoute:
2929
let detail = DetailViewController()

Example/ModuleRouteExample/ViewController.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import ModuleRoute
1111
class ViewController: UIViewController {
1212

1313
@MRInject var navigator: MRNavigator
14+
@MRInject var detail: DetailInterface
1415
// MARK: - Properties
1516
private var collectionView: UICollectionView!
1617
private let cellIdentifier = "Cell"
@@ -74,7 +75,9 @@ extension ViewController: UICollectionViewDelegate {
7475
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
7576
let item = items[indexPath.item]
7677
if indexPath.item == 1 {
77-
navigator.navigate(to: DetailRoute(), from: self)
78+
// navigator.navigate(to: DetailRoute(), from: self)
79+
let result = detail.handle(route: DetailRoute())
80+
print(result)
7881
} else {
7982
navigator.navigate(to: ChatRoute(), from: self)
8083
}

Sources/ModuleRoute/MRDependencyContainer.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
// Created by GIKI on 2025/2/15.
66
//
77

8-
import Foundation
98
import Foundation
109

1110
public typealias DependencyFactory = () -> Any
@@ -30,11 +29,11 @@ public class DefaultDependencyContainer: DependencyContainer {
3029

3130
public func resolve<T>(_ type: T.Type) -> T? {
3231
let key = "\(type)"
33-
// 检查是否已有实例
32+
// 若已存在实例,则直接返回
3433
if let instance = instances[key] as? T {
3534
return instance
3635
}
37-
// 使用工厂创建新实例
36+
// 否则使用注册的工厂方法创建实例
3837
if let factory = factories[key] {
3938
let instance = factory()
4039
instances[key] = instance

Sources/ModuleRoute/MRNavigator.swift

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,29 +9,34 @@ import UIKit
99

1010
public class MRNavigator {
1111
private let container: DependencyContainer
12-
private var routeToModuleTypeMap: [String: (DependencyContainer) -> MRModule] = [:]
13-
private var moduleFactoryMap: [String: () -> MRModule] = [:]
12+
1413
private var middlewares: [MRMiddleware] = []
1514
private var interceptors: [MRInterceptor] = []
1615
private var deepLinkParser = DeepLinkParser()
1716
private var logger: MRLogger = DefaultLogger()
1817
private var permissionChecker: MRPermissionChecker = DefaultPermissionChecker()
1918

19+
// 在初始化时,将自身注册到容器中,保证 MRNavigator 也能被注入
2020
public init(container: DependencyContainer = DefaultDependencyContainer.shared) {
2121
self.container = container
22+
// 将当前 navigator 注册为依赖项
23+
self.container.register(dependencyFactory: { self }, forType: MRNavigator.self)
2224
}
2325

26+
// 修改后的字典,使用 ObjectIdentifier 作为键
27+
private var routeToModuleTypeMap: [ObjectIdentifier: (DependencyContainer) -> MRModuleInterface] = [:]
28+
2429
// MARK: - Registration
25-
public func register<Interface, Module>(dependencyFactory: @escaping () -> Module,
26-
forType type: Interface.Type) where Module: MRModule {
30+
public func register<T>(dependencyFactory: @escaping DependencyFactory, forType type: T.Type) where T: MRModuleInterface {
2731
container.register(dependencyFactory: dependencyFactory, forType: type)
2832

29-
// 注册路由映射
30-
Module.supportedRoutes.forEach { routeType in
31-
routeToModuleTypeMap[routeType.name] = { container in
33+
// 将模块的所有支持路由逐一映射到通过容器解析模块实例的闭包
34+
T.supportedRoutes.forEach { routeType in
35+
let key = ObjectIdentifier(routeType)
36+
routeToModuleTypeMap[key] = { container in
3237
// 通过容器获取模块实例
33-
guard let module = container.resolve(Module.self) else {
34-
fatalError("Failed to resolve module: \(Module.self)")
38+
guard let module = container.resolve(T.self) else {
39+
fatalError("Failed to resolve module: \(T.self)")
3540
}
3641
return module
3742
}
@@ -60,7 +65,7 @@ public class MRNavigator {
6065
return
6166
}
6267

63-
// 处理路由
68+
// 通过中间件处理路由,链式调用
6469
let result = processMiddlewares(route: route)
6570
handleResult(result, from: viewController, navigationType: navigationType, animated: animated, completion: completion)
6671
}
@@ -75,7 +80,7 @@ public class MRNavigator {
7580
return false
7681
}
7782

78-
if let rootVC = UIApplication.shared.keyWindow?.rootViewController {
83+
if let rootVC = UIApplication.shared.windows.first(where: { $0.isKeyWindow })?.rootViewController {
7984
navigate(to: route, from: rootVC)
8085
return true
8186
}
@@ -97,20 +102,20 @@ public class MRNavigator {
97102

98103
// MARK: - Route Handling
99104
private func handleRouteDirectly(route: MRRoute) -> RouteResult {
100-
// 检查拦截器
105+
// 检查是否有拦截器需要处理当前路由
101106
for interceptor in interceptors {
102107
if interceptor.shouldIntercept(route: route) {
103108
return interceptor.handleInterception(route: route)
104109
}
105110
}
106111

107-
// 获取对应的模块工厂
108-
guard let moduleFactory = routeToModuleTypeMap[type(of: route).name] else {
109-
logger.log(level: .warning, message: "No module found for route: \(type(of: route).name)", metadata: nil)
112+
// 通过路由的类型获取模块
113+
let routeTypeKey = ObjectIdentifier(type(of: route))
114+
guard let moduleFactory = routeToModuleTypeMap[routeTypeKey] else {
115+
logger.log(level: .warning, message: "No module found for route: \(type(of: route))", metadata: nil)
110116
return .none
111117
}
112118

113-
// 通过容器获取或创建模块实例
114119
let module = moduleFactory(container)
115120
let result = module.handle(route: route)
116121
logRoute(route, result: result)
@@ -132,11 +137,9 @@ public class MRNavigator {
132137
case .handler(let handler):
133138
handler()
134139
completion?()
135-
case .service(_):
136-
completion?()
137-
case .value(_):
138-
completion?()
139-
case .none:
140+
case .service(_),
141+
.value(_),
142+
.none:
140143
completion?()
141144
}
142145
}
@@ -177,10 +180,10 @@ public class MRNavigator {
177180
}
178181
return nil
179182
}
180-
183+
181184
private func logRoute(_ route: MRRoute, result: RouteResult) {
182185
logger.log(level: .info,
183-
message: "Processing route: \(type(of: route).name)",
186+
message: "Processing route: \(type(of: route))",
184187
metadata: ["params": route.params, "result": String(describing: result)])
185188
}
186189
}

Sources/ModuleRoute/MRPermission.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ class DefaultPermissionChecker: MRPermissionChecker {
1717
func hasPermission(for route: MRRoute) -> Bool {
1818
return true
1919
}
20-
2120
func handleUnauthorized(route: MRRoute) -> RouteResult {
2221
return .none
2322
}

Sources/ModuleRoute/ModuleRoute.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@ public enum RouteResult {
2424
}
2525

2626
public protocol MRModuleInterface {
27+
static var supportedRoutes: [MRRoute.Type] { get }
2728
func handle(route: MRRoute) -> RouteResult
2829
}
2930

3031
public protocol MRModule: MRModuleInterface {
31-
static var supportedRoutes: [MRRoute.Type] { get }
32+
3233
}
3334

3435
// MARK: - Basic Route Implementation

0 commit comments

Comments
 (0)