Schichten ohne DI-Framework verbinden
Komponieren Sie Objekte am App-Einstiegspunkt mit dem Composition-Root-Pattern.
Schichten ohne DI-Framework verbinden ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Composition Root
Der Composition Root ist der einzige Ort, an dem alle Objekte instanziiert und miteinander verdrahtet werden. In einer SwiftUI-App ist dies normalerweise @main.
@main
struct MyApp: App {
// All wiring happens here
private let container = AppContainer()
var body: some Scene {
WindowGroup { container.makeRootView() }
}
}AppContainer-Muster
Eine AppContainer-Struct oder -Klasse erstellt den Objektgraphen und verbirgt die Komplexität der Verdrahtung vor der App-Struct.
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) }
}Lazy-Eigenschaften für die Reihenfolge
Verwenden Sie lazy-Eigenschaften, damit Abhängigkeiten in der richtigen Reihenfolge erstellt werden, ohne dass Sie die Reihenfolge manuell festlegen müssen.
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)
}Factory-Methoden
Fügen Sie dem Container Factory-Methoden hinzu, um Objekte auf View-Ebene mit bildschirmspezifischen Abhängigkeiten zu erstellen.
extension AppContainer {
func makeOrderFlow() -> OrderFlowView {
let repo = RemoteOrderRepository(api: api)
let useCase = PlaceOrderUseCase(repo: repo)
let vm = OrderViewModel(useCase: useCase)
return OrderFlowView(viewModel: vm)
}
}Environment-Werte für die Injektion
Verwenden Sie in SwiftUI eigene EnvironmentKeys, um Abhängigkeiten tief in den View-Baum einzuschleusen, ohne sie durch jede Ebene weiterreichen zu müssen.
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 }
}
}Den Environment-Key verwenden
Schleusen Sie Abhängigkeiten mit .environment(\.fetchUser, container.fetchUser) ein und lesen Sie sie in Views mit @Environment(\.fetchUser) aus.
ContentView()
.environment(\.fetchUser, container.fetchUser)
// In a deep view:
@Environment(\.fetchUser) private var fetchUserBereiche für Container
Erstellen Sie untergeordnete Container für Feature-Bereiche. Diese übernehmen gemeinsam genutzte Abhängigkeiten und verwalten zugleich die featurespezifischen Abhängigkeiten.
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
}
}Den Composition Root testen
Testen Sie die Factory-Methoden des Containers, indem Sie überprüfen, ob die zurückgegebenen Objekte den richtigen Typ und die richtige Konfiguration haben.
func testContainerBuildsProfileView() {
let container = AppContainer(db: InMemoryDatabase())
let view = container.makeRootView()
XCTAssertTrue(type(of: view) == ProfileView.self)
}Zirkuläre Abhängigkeiten vermeiden
Wenn A von B und B von A abhängt, führen Sie einen Mediator ein oder strukturieren Sie Verantwortlichkeiten um, um den Zyklus zu durchbrechen.
// Circular:
// UserService → NotificationService → UserService
// Fix: UserService → NotificationInput (protocol) ← NotificationServiceWann ein DI-Framework sinnvoll ist
Manuelles Verdrahten eignet sich gut für mittelgroße Apps. Ziehen Sie Frameworks (Needle, Swinject) erst in Betracht, wenn der Container zu groß für eine wartbare Pflege wird.
// Manual: fine for <20 top-level dependencies
// Framework: helps with large teams, 50+ services, code-generation for factoriesBeispielzusammenfassung
Vollständiges Verdrahtungsbeispiel in einer kleinen App: Der Container erstellt alle Abhängigkeiten und eine Factory erzeugt die Root-View.
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))
}
}Kurze Überprüfung
Was ist der Composition Root in einer Swift-App?
Zusammenfassung der Lektion
Verdrahten Sie Ihre App in einem Composition Root (normalerweise @main). Verwenden Sie einen AppContainer mit lazy-Eigenschaften für die richtige Erstellungsreihenfolge. Fügen Sie Factory-Methoden für bildschirmspezifische Objektgraphen hinzu. Schleusen Sie tiefe Abhängigkeiten über eigene EnvironmentKeys ein. Durchbrechen Sie zirkuläre Abhängigkeiten mit Mediator-Protokollen.
Lerne Swift mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 122
- Lektionen
- 409
Häufig gestellte Fragen
Ist die Lektion „Schichten ohne DI-Framework verbinden“ kostenlos?
Ja — der vollständige Text von „Schichten ohne DI-Framework verbinden“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Schichten ohne DI-Framework verbinden“?
Komponieren Sie Objekte am App-Einstiegspunkt mit dem Composition-Root-Pattern. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Swift Academy zu starten?
Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Schichten ohne DI-Framework verbinden“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?
Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Schichten: Domain, Daten und Präsentation
- Use-Case- und Repository-Pattern
- Dependency Inversion mit Protokollabstraktionen
- Schichten ohne DI-Framework verbinden