Sobes.tech
Middle

Was ist der Unterschied zwischen Dependency Inversion und Dependency Injection?

sobes.tech KI

Antwort von AI

Die Dependency Inversion (Prinzip der Abhängigkeitsumkehr) ist eines der SOLID-Prinzipien, das besagt:

  1. Module höherer Ebene sollten nicht von Modulen niedrigerer Ebene abhängen. Beide sollten von Abstraktionen abhängen.
  2. Abstraktionen sollten nicht von Details abhängen, Details sollten von Abstraktionen abhängen.

Dependency Injection (DI) ist ein Entwurfsmuster, eine der Möglichkeiten, die Dependency Inversion zu implementieren. Es beinhaltet, Abhängigkeiten (Objekte, von denen eine Klasse abhängt) von außen zu übergeben, anstatt dass die Klasse sie selbst erstellt.

Hauptunterschiede:

  • DIC - Entwurfprinzip, DI - Entwurfsmuster.
  • DIC - legt fest, wie die Beziehungen zwischen hoch- und niedrigstufigen Modulen (Abhängigkeit von Abstraktionen) sein sollten.
  • DI - Methode, die diese Beziehungen umsetzt. Es ist eine konkrete Technik, um Abhängigkeiten an ein Objekt zu liefern.

Beispiele für Dependency Injection:

  • Konstruktor-Injektion: Abhängigkeiten werden über den Konstruktor übergeben.

    // Swift
    class UserFetcher {
        private let apiService: APIServiceProtocol // Abhängigkeit von der Abstraktion
    
        init(apiService: APIServiceProtocol) { // Injektion über den Konstruktor
            self.apiService = apiService
        }
    
        func fetchUsers() {
            // Verwendung von apiService
        }
    }
    
    protocol APIServiceProtocol {
        // ...
    }
    
  • Property-Injektion: Abhängigkeiten werden über öffentliche Eigenschaften gesetzt (oft mit @IBOutlet oder wenn die Abhängigkeit optional ist).

    // Swift
    class UserController: UIViewController {
        var userFetcher: UserFetcherProtocol? // Abhängigkeit, die von außen gesetzt werden kann
    
        override func viewDidLoad() {
            super.viewDidLoad()
            userFetcher?.fetchUsers()
        }
    }
    
    protocol UserFetcherProtocol {
        func fetchUsers()
    }
    
  • Methoden-Injektion: Abhängigkeiten werden als Parameter an Methoden übergeben.

    // Swift
    class DataProcessor {
        func process(data: Data, using parser: DataParserProtocol) { // Abhängigkeit wird an die Methode übergeben
            parser.parse(data)
        }
    }
    
    protocol DataParserProtocol {
        func parse(_ data: Data)
    }
    

Auf diese Weise ist die Dependency Inversion das Ziel (Reduzierung der Kopplung durch Abstraktionen), und die Dependency Injection ist das Mittel (eine der Möglichkeiten, dieses Ziel zu erreichen).