0Pricing
Swift Academy · Ders

DI Çerçevesi Olmadan Katmanları Birleştirme

Composition Root kalıbını kullanarak nesneleri uygulama giriş noktasında birleştirin.

DI Çerçevesi Olmadan Katmanları Birleştirme, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 4 dersten oluşur.

Bileşim Kökü

Bileşim Kökü, tüm nesnelerin örneklendirildiği ve birbirine bağlandığı tek konumdur. SwiftUI uygulamasında bu konum genellikle @main'dir.

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

AppContainer Kalıbı

Bir AppContainer yapı/sınıfı nesne grafiğini oluşturur ve bağlantı karmaşıklığını App yapısından gizler.

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) }
}

Sıralama için Tembel Özellikler

Bağımlılıkların manuel sıralama gerektirmeden doğru sırayla oluşturulmasını sağlamak için lazy özelliklerini kullanın.

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)
}

Fabrika Yöntemleri

Ekrana özgü bağımlılıklarla görünüm düzeyindeki nesneleri oluşturmak için kapsayıcıya fabrika yöntemleri ekleyin.

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

Enjeksiyon için Ortam Değerleri

SwiftUI'da, özellikleri tek tek aktarmadan bağımlılıkları görünüm ağacının derinliklerine enjekte etmek için özel EnvironmentKey'ler kullanın.

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 }
  }
}

Ortam Anahtarını Kullanma

.environment(\.fetchUser, container.fetchUser) ile enjekte edin ve görünümlerde @Environment(\.fetchUser) ile okuyun.

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

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

Kapsamlı Kapsayıcılar

Özellik kapsamları için alt kapsayıcılar oluşturun; bu kapsayıcılar paylaşılan bağımlılıkları devralırken özelliğe özgü bağımlılıkların sahibi olur.

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
  }
}

Bileşim Kökünü Test Etme

Döndürülen nesnelerin doğru türe ve yapılandırmaya sahip olduğunu doğrulayarak kapsayıcının fabrika yöntemlerini test edin.

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

Döngüsel Bağımlılıklardan Kaçınma

A, B'ye ve B de A'ya bağımlıysa, döngüyü kırmak için bir aracı tanıtın veya sorumlulukları yeniden yapılandırın.

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

DI Çerçevesine Ne Zaman Başvurmalı?

Orta ölçekli uygulamalarda manuel bağlantılandırma iyi ölçeklenir. Kapsayıcının bakımı çok zorlaşırsa çerçeveleri (Needle, Swinject) değerlendirin.

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

Özet Örneği

Küçük bir uygulamada tam bağlantılandırma örneği: Kapsayıcı tüm bağımlılıkları oluşturur ve bir fabrika kök görünümü üretir.

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))
  }
}

Kısa Kontrol

Bir Swift uygulamasında Bileşim Kökü nedir?

Ders Özeti

Uygulamanızı bir Bileşim Kökü'nde (genellikle @main) bağlayın. Doğru oluşturma sırası için lazy özelliklerine sahip bir AppContainer kullanın. Ekrana özgü grafikler için fabrika yöntemleri ekleyin. Derinlerdeki bağımlılıkları özel EnvironmentKey'ler aracılığıyla enjekte edin. Döngüsel bağımlılıkları aracı protokollerle kırın.

Sıkça Sorulan Sorular

“DI Çerçevesi Olmadan Katmanları Birleştirme” dersi ücretsiz mi?

Evet — “DI Çerçevesi Olmadan Katmanları Birleştirme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 4 dersten oluşur.

“DI Çerçevesi Olmadan Katmanları Birleştirme” dersinde ne öğreneceğim?

Composition Root kalıbını kullanarak nesneleri uygulama giriş noktasında birleştirin. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Swift Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“DI Çerçevesi Olmadan Katmanları Birleştirme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Katmanlar: Alan, Veri ve Sunum
  2. Kullanım Durumu ve Depo Kalıpları
  3. Protokol Soyutlamalarıyla Bağımlılığın Tersine Çevrilmesi
  4. DI Çerçevesi Olmadan Katmanları Birleştirme
← Swift Academy Sayfasına Dön