Сегодня поговорим о
Dependency Injection (DI) - мощный подход, который делает ваш код чище, тестируемым и гибким.
Что такое Dependency Injection:
Это способ передачи зависимостей извне, вместо создания их внутри класса.
Без использования DI:
class MyViewModel {
private let service = MyService() // Зависимость создаётся внутри
}
С использованием DI:
class MyViewModel {
private let service: MyService
init(service: MyService) { // Зависимость передаётся извне
self.service = service
}
}
Зачем это нужно:
- Тестируемость: можно подменять зависимости на моки.
- Гибкость: легко менять реализации (например, для разных сборок).
- Чистая архитектура: сущности не знают, как создаются их зависимости.
- Масштабирование: удобное расширение функционала благодаря добавлению зависимостей.
Три способа внедрения зависимостей в SwiftUI:
Через инициализатор (Constructor Injection):
struct MyContentView: View {
let service: MyNetworkService
var body: some View {
Text(service.fetchText())
}
}
MyContentView(
service: MyNetworkService()
)
Через свойства (Property Injection):
class MyViewModel: ObservableObject {
var analytics: MyAnalyticsService? // Можно задать позже
}
let myViewModel = MyViewModel()
myViewModel.analytics = MyAnalyticsService()
Через .environmentObject (Environment):
@main
struct MyApp: App {
let service = MyNetworkService()
var body: some Scene {
WindowGroup {
MyContentView()
.environmentObject(service)
}
}
}
struct MyContentView: View {
@EnvironmentObject var service: MyNetworkService
var body: some View {
Text(service.fetchText())
}
}
Вывод:
Dependency Injection - это не просто модный паттерн, а реальный способ сделать ваш код чище и гибче. Начните с малого - вынесите хотя бы одну зависимость наружу, и вы сразу заметите, насколько проще стало тестировать и менять логику.