iOS Dependency Injection
Priority: P0
Implementation Workflow
- Prefer initializer injection — Pass dependencies through
initas the primary approach. - Inject protocols — Always depend on protocols instead of concrete classes for testability.
- Choose a DI library — Use
Factoryfor lightweight DI,Swinjectfor enterprise-grade container-based projects. - Apply correct scoping — Singleton for app-wide services (Auth, Network); Unique/Transient for ViewModels; Graph/Cached for feature flows.
See protocol-based DI and Factory registration examples
Anti-Patterns
- ❌ Global singleton access everywhere — inject services via initializer
- ❌
Resolver.resolve()inside business logic — pass dependencies via constructor - ❌ Direct class instantiation — depend on protocols for testability