0Pricing
Swift Academy · Pelajaran

Menghubungkan Lapisan tanpa Framework DI

Mengomposisikan objek di titik masuk aplikasi menggunakan pola Composition Root.

Menghubungkan Lapisan tanpa Framework DI adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 4 pelajaran total.

Akar Komposisi

Akar Komposisi adalah satu-satunya lokasi tempat semua objek dibuat dan dihubungkan. Dalam aplikasi SwiftUI, biasanya lokasinya adalah @main.

@main
struct MyApp: App {
  // All wiring happens here
  private let container = AppContainer()
  var body: some Scene {
    WindowGroup { container.makeRootView() }
  }
}

Pola AppContainer

Struktur/kelas AppContainer membangun grafik objek dan menyembunyikan kerumitan pengaitan dari struktur App.

final class AppContainer {
  let db = SQLiteDatabase()
  lazy var userRepo: UserRepository = RemoteUserRepository(db: db)
  lazy var fetchUser = FetchUserUseCase(repo: userRepo)
  lazy var profileVM = ProfileViewModel(useCase: fetchUser)
  func makeRootView() -> some View { ProfileView(viewModel: profileVM) }
}

Properti Tertunda untuk Pengurutan

Gunakan properti lazy untuk memastikan dependensi dibangun dalam urutan yang benar tanpa pengurutan manual.

final class Container {
  lazy var network: NetworkClient = URLSessionClient()
  lazy var api: APIService = APIService(client: network)  // created after network
  lazy var repo: ItemRepository = RemoteItemRepository(api: api)
}

Metode Pabrik

Tambahkan metode pabrik ke container untuk membuat objek tingkat tampilan dengan dependensi per layar.

extension AppContainer {
  func makeOrderFlow() -> OrderFlowView {
    let repo = RemoteOrderRepository(api: api)
    let useCase = PlaceOrderUseCase(repo: repo)
    let vm = OrderViewModel(useCase: useCase)
    return OrderFlowView(viewModel: vm)
  }
}

Nilai Environment untuk Injeksi

Di SwiftUI, gunakan EnvironmentKey khusus untuk menyuntikkan dependensi jauh ke dalam hierarki tampilan tanpa meneruskan properti secara berantai.

private struct FetchUserKey: EnvironmentKey {
  static let defaultValue: FetchingUser = FetchUserUseCase(repo: NullUserRepo())
}
extension EnvironmentValues {
  var fetchUser: FetchingUser {
    get { self[FetchUserKey.self] } set { self[FetchUserKey.self] = newValue }
  }
}

Menggunakan Kunci Environment

Lakukan injeksi melalui .environment(\.fetchUser, container.fetchUser) dan baca nilainya dengan @Environment(\.fetchUser) di dalam tampilan.

ContentView()
  .environment(\.fetchUser, container.fetchUser)

// In a deep view:
@Environment(\.fetchUser) private var fetchUser

Container dengan Cakupan

Buat container anak untuk cakupan fitur, yang mewarisi dependensi bersama tetapi memiliki dependensi khusus fiturnya sendiri.

final class CheckoutContainer {
  let cart: CartRepository
  let payment: PaymentService
  lazy var placeOrder = PlaceOrderUseCase(cart: cart, payment: payment)
  init(parent: AppContainer) {
    cart = parent.cartRepo
    payment = parent.paymentService
  }
}

Menguji Akar Komposisi

Uji metode pabrik container dengan memverifikasi bahwa objek yang dikembalikan memiliki tipe dan konfigurasi yang benar.

func testContainerBuildsProfileView() {
  let container = AppContainer(db: InMemoryDatabase())
  let view = container.makeRootView()
  XCTAssertTrue(type(of: view) == ProfileView.self)
}

Menghindari Dependensi Sirkular

Jika A bergantung pada B dan B bergantung pada A, perkenalkan mediator atau susun ulang tanggung jawab untuk memutus siklus tersebut.

// Circular:
// UserService → NotificationService → UserService
// Fix: UserService → NotificationInput (protocol) ← NotificationService

Kapan Menggunakan Kerangka Kerja DI

Pengaitan manual dapat diterapkan dengan baik pada aplikasi berukuran menengah. Pertimbangkan kerangka kerja (Needle, Swinject) hanya ketika container menjadi terlalu besar untuk dipelihara.

// Manual: fine for <20 top-level dependencies
// Framework: helps with large teams, 50+ services, code-generation for factories

Contoh Ringkasan

Contoh pengaitan lengkap dalam aplikasi kecil: container membangun semua dependensi dan sebuah pabrik menghasilkan tampilan akar.

final class AppContainer {
  private let db = CoreDataStack.shared
  lazy var userRepo: UserRepository = LocalUserRepository(db: db)
  lazy var fetchUser = FetchUserUseCase(repo: userRepo)
  func makeContentView() -> ContentView {
    ContentView(viewModel: ProfileViewModel(useCase: fetchUser))
  }
}

Pemeriksaan Singkat

Apa yang dimaksud dengan Akar Komposisi dalam aplikasi Swift?

Ringkasan Pelajaran

Hubungkan aplikasi Anda di Akar Komposisi (biasanya @main). Gunakan AppContainer dengan properti lazy agar urutan pembangunan benar. Tambahkan metode pabrik untuk grafik per layar. Suntikkan dependensi yang berada jauh di dalam hierarki melalui EnvironmentKey khusus. Putus dependensi sirkular dengan protokol mediator.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menghubungkan Lapisan tanpa Framework DI” gratis?

Ya — teks lengkap “Menghubungkan Lapisan tanpa Framework DI” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Menghubungkan Lapisan tanpa Framework DI”?

Mengomposisikan objek di titik masuk aplikasi menggunakan pola Composition Root. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Swift Academy?

Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Menghubungkan Lapisan tanpa Framework DI” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Lapisan: Domain, Data, dan Presentasi
  2. Pola Use Case dan Repositori
  3. Inversi Dependensi dengan Abstraksi Protokol
  4. Menghubungkan Lapisan tanpa Framework DI
← Kembali ke Swift Academy