跳到主要内容

跨模块依赖注入

问题

组件化后模块间如何解耦依赖?

答案

依赖倒置原则

模块 A 依赖协议而非实现,模块 B 提供实现,两者互不 import。

手动注入

// 协议定义 - 放在 CoreInterface 模块
protocol AnalyticsService {
func track(event: String, params: [String: Any])
}

// 实现 - 放在 Analytics 模块
class FirebaseAnalyticsService: AnalyticsService {
func track(event: String, params: [String: Any]) {
// Firebase 实现
}
}

// 使用方 - 构造器注入
class OrderViewModel {
private let analytics: AnalyticsService

init(analytics: AnalyticsService) {
self.analytics = analytics
}
}

Factory 库(推荐)

import Factory

extension Container {
var analyticsService: Factory<AnalyticsService> {
self { FirebaseAnalyticsService() }
.singleton
}
}

// 使用
class OrderViewModel: ObservableObject {
@Injected(\.analyticsService) private var analytics
}

常见面试问题

Q1: 三种注入方式的区别?

答案

  • 构造器注入:初始化时传入,不可变,最安全
  • 属性注入:通过属性赋值,灵活但可能遗忘
  • 方法注入:调用方法时传入,适合临时依赖

相关链接