Was ist Abhängigkeitsinjektion in Magento 2?


7

Ich bin neu in Magento 2.

Ich wollte wissen, was Abhängigkeitsinjektion in Magento 2 ist.

Worum geht es in dem Konzept und wie wird es in unserem Framework verwendet?

Ich habe diese Dokumentation verwiesen

Aber ich habe das Konzept immer noch nicht richtig verstanden.

Antworten:


11

Innerhalb eines Projekts interagieren Klassen miteinander.
Wir können also sagen, dass eine Klasse von anderen Klassen abhängt.
Es gibt zwei Möglichkeiten, wie die Verbindung hergestellt werden kann.

  1. Die Klasse findet ihre Abhängigkeiten.
  2. Die Abhängigkeiten werden der Klasse zur Verfügung gestellt.

Magento 1 verfolgt den ersten Ansatz. Hier ist ein zufälliges Beispiel . In diesem Beispiel hängt das Kategoriemodell von der Instanz zum Umschreiben der URL ab. Also instanziiert es es.

Magento 2 verfolgt den zweiten Ansatz .

Beim Erstellen einer Klasse werden alle Abhängigkeiten im Konstruktor angegeben.
Bei Verwendung wird die Klasse über eine Factory-Methode instanziiert, die die Signatur des Klassenkonstruktors liest, um zu überprüfen, welche Abhängigkeiten erforderlich sind.

Magento 2 verfügt auch über einen Abhängigkeitsinjektionscontainer (DIC), bei dem es sich im Grunde um ein großes Array mit den Klassen handelt, die instanziiert werden.
Beim Versuch, eine Klasse zu instanziieren, wird überprüft, ob ihre Abhängigkeiten bereits im DIC vorhanden sind.
Wenn dies der Fall ist, werden sie dem Konstruktor bereitgestellt. Wenn nicht, wird die Abhängigkeitsklasse auf dieselbe Weise instanziiert wie die aktuelle Klasse, die Sie instanziieren möchten.

Das ist es auf den Punkt gebracht. In der Praxis ist dies etwas komplizierter, da auch Konfigurationsdateien beteiligt sind ( di.xml). Einige Abhängigkeiten können Schnittstellen sein, die nicht instanziiert werden können. Diese Factory-Methode liefert jedoch eine Klasse, die diese Schnittstelle implementiert, wenn Ihre Klasse instanziiert wird, basierend auf deren Inhalt di.xmlDatei.
Auch sind einige Abhängigkeiten keine Objekte. Sie können Arrays, Zeichenfolgen usw. sein. Sie werden der Klasse über dieselbe di.xmlDatei bereitgestellt .

Wenn Sie graben und sehen möchten, wie es tatsächlich passiert, können Sie mit dieser Klasse beginnen https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php.
Aber es ist nicht leicht zu folgen. Du brauchst etwas Geduld.


Danke Mauris. Es klärte das Konzept.
Mrunmay Deswandikar

1

In Programmiersprachen ist eine Abhängigkeit als das Objekt bekannt, das von einer Klasse benötigt wird, um einige Funktionen auszuführen. Injektion ist die Übergabe dieser bestimmten Abhängigkeit an ein abhängiges Objekt / eine abhängige Klasse. Die eigentliche Bedeutung von Dependency Injection besteht darin, die Abhängigkeit von einer anderen Quelle in die Klasse zu injizieren.

Wenn Sie beispielsweise in Magento 2 eine Klasse definiert haben, die mithilfe der Magento 2-Hilfsklasse einige Daten abruft, können wir sagen, dass Ihre Klasse von diesem Magento 2-Hilfsobjekt abhängig ist.

Nehmen wir ein Beispiel:

class Customer
{
   private $firstName;
   private $lastName;

   public function __construct($firstName, $lastName)
   {
      $this->firstName = $firstName;
      $this->lastName = $lastName;
   }

   public function getFirstName()
   {
      return $this->firstName;
   }

   public function getLastName()
   {
      return $this->lastName;
   }
}

class CustomerInfo
{
   private $customer;
   public function __construct($customerFirstName, $customerLastName)
   {
      $this->customer = new Customer($customerFirstName, $customerLastName);
   }

   public function getCustomer()
   {
      return $this->customer;
   }
}

An dem obigen Code ist nichts auszusetzen. Der Vor- und Nachname wird ohne Probleme zurückgegeben. Die Customer-Klasse ist jedoch eng mit der CustomerInfo-Klasse gekoppelt. Wenn Sie dem Konstruktor der Kundenklasse einen neuen Parameter hinzufügen, müssen Sie jede Klasse, in der Sie ein Kundenobjekt erstellt haben, mit dem neuen Operator ändern, wodurch es einem langwierigen und langwierigen Prozess unterzogen wird, insbesondere bei großen Anwendungen .

Die Abhängigkeitsinjektion löst diese Probleme, indem die Abhängigkeiten über den Konstruktor der abhängigen Klasse injiziert werden. Das Ergebnis ist ein hochgradig wartbarer Code, der in langfristigen Projekten verwendet werden kann. Es könnte so aussehen:

class Customer
{
   private $firstName;
   private $lastName;

   public function __construct($firstName, $lastName)
   {
       $this->firstName = $firstName;
       $this->lastName = $lastName;
   }

   public function getFirstName()
   {
      return $this->firstName;
   }

   public function getLastName()
   {
      return $this->lastName;
   }
}


class CustomerInfo
{
   private $customer;
   public function __construct(Customer $customer)
   {
      $this->customer = $customer;
   }

   public function getCustomer()
   {
      return $this->customer;
   }
}

Im obigen Code haben wir die Abhängigkeit nicht mit dem neuen Operator instanziiert, sondern in einem __construct-Parameter definiert. Es ist als automatische Abhängigkeitsinjektion bekannt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.