Sobes.tech
Middle

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ă:

  1. Modulele de nivel superior nu trebuie să depindă de modulele de nivel inferior. Ambele trebuie să depindă de abstracții.
  2. 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 @IBOutlet sau 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).