0Pricing
Swift Academy · Leçon

Relier les couches sans framework DI

Composer les objets au point d’entrée de l’application avec le modèle Composition Root.

Relier les couches sans framework DI est une leçon Swift Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Swift Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Swift Academy comprend 4 leçons au total.

Racine de composition

La racine de composition est l’emplacement unique où tous les objets sont instanciés et reliés entre eux. Dans une application SwiftUI, il s’agit généralement de @main.

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

Modèle AppContainer

Une structure ou une classe AppContainer construit le graphe d’objets et masque la complexité de l’assemblage à la structure 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) }
}

Propriétés lazy pour respecter l’ordre

Utilisez des propriétés lazy pour garantir que les dépendances sont construites dans le bon ordre, sans gestion manuelle de cet ordre.

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

Méthodes d’usine

Ajoutez des méthodes d’usine au conteneur pour créer des objets au niveau des vues avec des dépendances propres à chaque écran.

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

Valeurs d’environnement pour l’injection

Dans SwiftUI, utilisez des EnvironmentKey personnalisées pour injecter des dépendances profondément dans l’arbre des vues, sans transmettre les propriétés de vue en vue.

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

Utilisation de la clé d’environnement

Injectez la dépendance avec .environment(\.fetchUser, container.fetchUser) et lisez-la avec @Environment(\.fetchUser) dans les vues.

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

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

Conteneurs à portée limitée

Créez des conteneurs enfants pour les portées des fonctionnalités. Ils héritent des dépendances partagées tout en possédant celles qui sont propres à la fonctionnalité.

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

Tester la racine de composition

Testez les méthodes d’usine du conteneur en vérifiant que les objets renvoyés ont le type et la configuration appropriés.

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

Éviter les dépendances circulaires

Si A dépend de B et B dépend de A, introduisez un médiateur ou restructurez les responsabilités pour rompre le cycle.

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

Quand utiliser une infrastructure DI

L’assemblage manuel s’adapte bien aux applications de taille moyenne. Envisagez des infrastructures (Needle, Swinject) uniquement lorsque le conteneur devient trop volumineux à maintenir.

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

Exemple récapitulatif

Exemple complet d’assemblage dans une petite application : le conteneur construit toutes les dépendances et une méthode d’usine produit la vue racine.

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

Vérification rapide

Qu’est-ce que la racine de composition dans une application Swift ?

Récapitulatif de la leçon

Assemblez votre application à une racine de composition (généralement @main). Utilisez un AppContainer avec des propriétés lazy pour respecter l’ordre de construction. Ajoutez des méthodes d’usine pour les graphes propres à chaque écran. Injectez les dépendances profondes au moyen de EnvironmentKey personnalisées. Rompez les dépendances circulaires avec des protocoles médiateurs.

Questions Fréquemment Posées

La leçon « Relier les couches sans framework DI » est-elle gratuite ?

Oui — le texte complet de « Relier les couches sans framework DI » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Swift Academy, passe à CoddyKit PRO. Le cours Swift Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Relier les couches sans framework DI » ?

Composer les objets au point d’entrée de l’application avec le modèle Composition Root. Tu pratiques Swift Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Swift Academy ?

Aucune expérience préalable n'est requise. Swift Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Relier les couches sans framework DI » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Swift Academy ?

Oui. Chaque leçon Swift Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Couches : domaine, données et présentation
  2. Modèles de cas d’utilisation et de référentiel
  3. Inversion des dépendances avec des abstractions de protocoles
  4. Relier les couches sans framework DI
← Retour à Swift Academy