跨模块依赖注入
问题
组件化后模块间如何解耦依赖?
答案
依赖倒置原则
模块 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: 三种注入方式的区别?
答案:
- 构造器注入:初始化时传入,不可变,最安全
- 属性注入:通过属性赋值,灵活但可能遗忘
- 方法注入:调用方法时传入,适合临时依赖