Care este diferența dintre inversarea dependenței și injecția de dependență?
sobes.tech AI
Răspuns de la AI
Inversiunea dependenței (Principiul Inversiunii Dependenței) este unul dintre principiile SOLID, care afirmă:
- Modulele de nivel superior nu trebuie să depindă de modulele de nivel inferior. Ambele trebuie să depindă de abstracții.
- Abstracțiile nu trebuie să depindă de detalii, detaliile trebuie să depindă de abstracții.
Injecția de dependență (Dependency Injection, DI) este un pattern de proiectare, una dintre modalitățile de implementare a inversiunii dependenței. Implică transmiterea dependențelor (obiecte de care depinde o clasă) din exterior, în loc ca clasa să le creeze singură.
Diferențele principale:
- DIC - principiu de proiectare, DI - pattern de proiectare.
- DIC - definește cum trebuie să fie relațiile între modulele de nivel înalt și cele de nivel scăzut (dependența de abstracții).
- DI - metoda care permite implementarea acestor relații. Este o tehnică concretă pentru furnizarea dependențelor unui obiect.
Exemple de injecție a dependențelor:
-
Injecție prin constructor: Dependențele sunt transmise prin constructor.
// Swift class UserFetcher { private let apiService: APIServiceProtocol // Dependență de abstracție init(apiService: APIServiceProtocol) { // Injecție prin constructor self.apiService = apiService } func fetchUsers() { // utilizarea apiService } } protocol APIServiceProtocol { // ... } -
Injecție prin proprietate: Dependențele sunt stabilite prin proprietăți publice (adesea cu
@IBOutletsau dacă dependența este opțională).// Swift class UserController: UIViewController { var userFetcher: UserFetcherProtocol? // Dependență care poate fi stabilită din exterior override func viewDidLoad() { super.viewDidLoad() userFetcher?.fetchUsers() } } protocol UserFetcherProtocol { func fetchUsers() } -
Injecție prin metodă: Dependențele sunt transmise ca parametri ai metodelor.
// Swift class DataProcessor { func process(data: Data, using parser: DataParserProtocol) { // Dependență transmisă metodei parser.parse(data) } } protocol DataParserProtocol { func parse(_ data: Data) }
Astfel, inversiunea dependenței este scopul (scăderea cuplajului prin abstracții), iar injecția de dependență este mijlocul (una dintre modalitățile de a atinge acest scop).