Koble sammen lag uten et DI-rammeverk
Sett sammen objekter ved appens inngangspunkt med mønsteret Composition Root.
Koble sammen lag uten et DI-rammeverk er en gratis leksjon i Swift Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Swift Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Swift Academy inneholder totalt 4 leksjoner.
Composition Root
Composition Root er det ene stedet der alle objekter opprettes og kobles sammen. I en SwiftUI-app er det vanligvis @main.
@main
struct MyApp: App {
// All wiring happens here
private let container = AppContainer()
var body: some Scene {
WindowGroup { container.makeRootView() }
}
}AppContainer-mønsteret
En AppContainer-struct eller -klasse bygger objektgrafen og skjuler kompleksiteten ved sammenkoblingen fra App-structen.
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) }
}Late egenskaper for riktig rekkefølge
Bruk lazy-egenskaper for å sikre at avhengigheter bygges i riktig rekkefølge uten manuell rekkefølgestyring.
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-metoder
Legg til factory-metoder i containeren for å opprette objekter på visningsnivå med avhengigheter per skjerm.
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-verdier for injeksjon
I SwiftUI bruker du egendefinerte EnvironmentKey-er til å injisere avhengigheter dypt i visningstreet uten prop-drilling.
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 }
}
}Bruke EnvironmentKey
Injiser via .environment(\.fetchUser, container.fetchUser) og les verdien med @Environment(\.fetchUser) i visninger.
ContentView()
.environment(\.fetchUser, container.fetchUser)
// In a deep view:
@Environment(\.fetchUser) private var fetchUserAvgrensede containere
Opprett underordnede containere for feature-områder. De arver delte avhengigheter, men eier sine egne feature-spesifikke avhengigheter.
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
}
}Teste Composition Root
Test factory-metodene i containeren ved å kontrollere at objektene som returneres, har riktig type og konfigurasjon.
func testContainerBuildsProfileView() {
let container = AppContainer(db: InMemoryDatabase())
let view = container.makeRootView()
XCTAssertTrue(type(of: view) == ProfileView.self)
}Unngå sirkulære avhengigheter
Hvis A avhenger av B og B avhenger av A, kan du introdusere en mediator eller omstrukturere ansvarsområdene for å bryte sirkelen.
// Circular:
// UserService → NotificationService → UserService
// Fix: UserService → NotificationInput (protocol) ← NotificationServiceNår bør du bruke et DI-rammeverk?
Manuell sammenkobling fungerer godt i apper av middels størrelse. Vurder rammeverk som Needle og Swinject først når containeren blir for stor til å vedlikeholde.
// Manual: fine for <20 top-level dependencies
// Framework: helps with large teams, 50+ services, code-generation for factoriesEksempel på oppsummering
Eksempel på full sammenkobling i en liten app: Containeren bygger alle avhengigheter, og en factory oppretter rotvisningen.
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))
}
}Kunnskapssjekk
Hva er Composition Root i en Swift-app?
Leksjonsoppsummering
Koble sammen appen i en Composition Root (vanligvis @main). Bruk en AppContainer med lazy-egenskaper for riktig byggerekkefølge. Legg til factory-metoder for grafer per skjerm. Injiser dyptliggende avhengigheter via egendefinerte EnvironmentKey-er. Bryt sirkulære avhengigheter med mediator-protokoller.
Lær deg Swift med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 122
- Leksjoner
- 409
Ofte stilte spørsmål
Er leksjonen «Koble sammen lag uten et DI-rammeverk» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Swift Academy, inkludert «Koble sammen lag uten et DI-rammeverk», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Swift Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Koble sammen lag uten et DI-rammeverk»?
Sett sammen objekter ved appens inngangspunkt med mønsteret Composition Root. Du øver på Swift Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Swift Academy?
Ingen tidligere erfaring er nødvendig. Swift Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Koble sammen lag uten et DI-rammeverk»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Swift Academy-leksjonen?
Ja. Alle Swift Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Lag: domene, data og presentasjon
- Use case- og repository-mønstre
- Avhengighetsinversjon med protokollabstraksjoner
- Koble sammen lag uten et DI-rammeverk