Integração das camadas sem um framework de DI
Componha objetos no ponto de entrada do aplicativo usando o padrão Composition Root.
Integração das camadas sem um framework de DI é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.
Raiz de Composição
A Raiz de Composição é o único local onde todos os objetos são instanciados e conectados. Em um aplicativo SwiftUI, normalmente ela é @main.
@main
struct MyApp: App {
// All wiring happens here
private let container = AppContainer()
var body: some Scene {
WindowGroup { container.makeRootView() }
}
}Padrão AppContainer
Uma estrutura/classe AppContainer cria o grafo de objetos, ocultando a complexidade das conexões da estrutura do aplicativo.
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) }
}Propriedades Lazy para Ordenação
Use propriedades lazy para garantir que as dependências sejam criadas na ordem correta, sem precisar ordená-las manualmente.
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étodos de Fábrica
Adicione métodos de fábrica ao contêiner para criar objetos no nível das visualizações com dependências específicas de cada tela.
extension AppContainer {
func makeOrderFlow() -> OrderFlowView {
let repo = RemoteOrderRepository(api: api)
let useCase = PlaceOrderUseCase(repo: repo)
let vm = OrderViewModel(useCase: useCase)
return OrderFlowView(viewModel: vm)
}
}Valores de Ambiente para Injeção
No SwiftUI, use EnvironmentKeys personalizados para injetar dependências profundamente na árvore de visualizações sem repassar propriedades por todos os níveis.
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 }
}
}Uso da Chave de Ambiente
Injete por meio de .environment(\.fetchUser, container.fetchUser) e leia com @Environment(\.fetchUser) nas visualizações.
ContentView()
.environment(\.fetchUser, container.fetchUser)
// In a deep view:
@Environment(\.fetchUser) private var fetchUserContêineres com Escopo
Crie contêineres filhos para os escopos das funcionalidades. Eles herdam as dependências compartilhadas, mas são responsáveis pelas dependências específicas da funcionalidade.
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
}
}Testando a Raiz de Composição
Teste os métodos de fábrica do contêiner verificando se os objetos retornados têm o tipo e a configuração corretos.
func testContainerBuildsProfileView() {
let container = AppContainer(db: InMemoryDatabase())
let view = container.makeRootView()
XCTAssertTrue(type(of: view) == ProfileView.self)
}Evitando Dependências Circulares
Se A depender de B e B depender de A, introduza um mediador ou reorganize as responsabilidades para quebrar o ciclo.
// Circular:
// UserService → NotificationService → UserService
// Fix: UserService → NotificationInput (protocol) ← NotificationServiceQuando Usar uma Estrutura de DI
A configuração manual funciona bem em aplicativos de tamanho médio. Considere estruturas como Needle e Swinject somente quando o contêiner se tornar grande demais para ser mantido.
// Manual: fine for <20 top-level dependencies
// Framework: helps with large teams, 50+ services, code-generation for factoriesExemplo de Recapitulação
Exemplo completo de configuração em um aplicativo pequeno: o contêiner cria todas as dependências e uma fábrica produz a visualização raiz.
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))
}
}Verificação Rápida
O que é a Raiz de Composição em um aplicativo Swift?
Recapitulação da lição
Configure seu aplicativo em uma Raiz de Composição, geralmente @main. Use um AppContainer com propriedades lazy para garantir a ordem correta de criação. Adicione métodos de fábrica para os grafos específicos de cada tela. Injete dependências profundas por meio de EnvironmentKeys personalizados. Quebre dependências circulares com protocolos mediadores.
Perguntas Frequentes
A aula “Integração das camadas sem um framework de DI” é grátis?
Sim — o texto completo de “Integração das camadas sem um framework de DI” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.
O que vou aprender em “Integração das camadas sem um framework de DI”?
Componha objetos no ponto de entrada do aplicativo usando o padrão Composition Root. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Swift Academy?
Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Integração das camadas sem um framework de DI”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Swift Academy?
Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Camadas: domínio, dados e apresentação
- Padrões de caso de uso e repositório
- Inversão de dependências com abstrações de protocolos
- Integração das camadas sem um framework de DI