Добавить объявление

Dependency Injection: как правильно внедрять зависимости в SwiftUI

Сегодня поговорим о 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 - это не просто модный паттерн, а реальный способ сделать ваш код чище и гибче. Начните с малого - вынесите хотя бы одну зависимость наружу, и вы сразу заметите, насколько проще стало тестировать и менять логику.
07.08.2025 61 417