it-swarm.com.de

Werksmuster und / oder Abhängigkeitsinjektion?

Ich verstehe das Konzept und kann sowohl das Factory-Muster als auch die Abhängigkeitsinjektion verwenden, jedoch scheinen sie konzeptionell ein wenig im Widerspruch zueinander zu stehen. Geht es darum, eins über das andere zu verwenden? Oder können sie zusammen verwendet werden?

Wenn Sie DI verwenden, würden Sie die Erstellung von Klassen innerhalb einer Factory hart codieren? Würde dies nicht den Punkt von DI besiegen? Da die Factory von der Existenz der von ihr erstellten Klassen abhängig ist und diese daher zur Laufzeit bei Verwendung von DI an die Factory übergeben müssen.

Oder würden Sie die Klassen, die die Fabrik erstellen soll, an die Fabrik übergeben, die erstellt werden soll? Wenn ja, würde das nicht den Sinn des Baus einer Fabrik zunichte machen? Da der Injektor im Grunde die ganze Arbeit der Fabrik erledigen würde.

Vielen Dank für Ihre Aufmerksamkeit, ich freue mich auf Ihre Erkenntnisse.

Wenn Sie DI verwenden, würden Sie die Erstellung von Klassen innerhalb einer Factory hart codieren? Würde dies nicht den Punkt von DI besiegen?

Nein, es verstößt nicht gegen das Prinzip der Abhängigkeitsinversion (nicht der Injektion), da es der Zweck der Fabrik ist, für uns ein konkretes Objekt zu erstellen.

Oder würden Sie die Klassen, die die Fabrik erstellen soll, an die Fabrik übergeben, die erstellt werden soll? Wenn ja, würde das nicht den Sinn des Baus einer Fabrik zunichte machen? Da der Injektor im Grunde die ganze Arbeit der Fabrik erledigen würde.

Sie haben Recht!

Factory-Muster sind die Erstellungsmuster - sie sind für die Erstellung von Instanzen verantwortlich.

Bei Abhängigkeitsinjektionsmustern geht es um lose Kopplung und Abhängigkeitsinversion (Inversion of Control) - sie injizieren Instanzen, die eine andere Instanz für ihre Arbeit benötigt.

Sie befassen sich mit verschiedenen Problemen und können zusammen verwendet werden. Ein Beispiel (vielleicht nicht großartig, aber ich hoffe, dass es den Job machen würde):

class Player {
    string name;
}

interface PlayerFactory {
    Person create();
}

class RealPlayerFactory : PlayerFactory {
    return GetPlayerFromDatabase();
}

class RandomPlayerFactory : PlayerFactory {
    Person result = new Person();
    result.name = GenerateRandomName();
    return result;
}

class Team {
    Team(PlayerFactory playerFactory) {
        for (int i=0; i < 11; ++i) {
            AddPlayer( playerFactory.create() );
        }
    }
}

Verwenden Sie Abhängigkeitsinjektionsmuster, um eine lose Kopplung einzuführen.

Verwenden Sie Factory Patterns, wenn Sie die Erstellung von Objekten delegieren müssen.

6
Pellared

Wenn Sie die Abhängigkeitsinjektion stark nutzen, teilen Sie Ihren Code in Teile mit Klassen/Objekten, die Merkmale und Funktionen enthalten, und in Code, in dem die erstere erstellt und die Abhängigkeiten aufgelöst werden. Letzteres kann entweder von durchgeführt werden

  • ein DI-Container
  • Fabrikklassen

DI widerspricht also nicht der Verwendung von Fabriken. Wenn Sie DI ohne DI-Container ausführen, benötigen Sie normalerweise viele Fabriken .

Siehe diese Blog-Beitrag für eine vollständigere Erklärung.

8
Doc Brown