iOS Dependency Injection
Priority: P0
Implementation Workflow
- Prefer initializer injection — Pass dependencies through
initas primary approach. - Inject protocols — Always depend on protocols instead of concrete classes for testability.
- Choose 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
- No Global Singletons: Inject services via initializer
- No Inline Service Resolution: Pass dependencies via constructor; avoid
Resolver.resolve()in business logic - No Concrete Class Dependencies: Depend on protocols for testability