yii2 Essay (7) Abhängigkeitsinjektion – (4) Service Locator
Service Locator Locator ist eine Lösung für die Abhängigkeitsinjektion. Wenn der Dienstbenutzer und der Dienstanbieter nicht dieselbe Person sind, muss der Benutzer wissen, wer den Dienst bereitstellt sind erforderlich, um die Korrektheit der Abhängigkeiten sicherzustellen, die Benutzer und Anbieter koppeln. Der Dienstanbieter registriert den Dienst im ServiceLocator (und registriert gleichzeitig die Abhängigkeiten) und weist den Dienst nur an, oder zu verwenden die Namen oder Aliase dieser Dienste, dann ist es sowohl für Dienstanbieter als auch für Benutzer von Vorteil. Benutzer müssen nur wissen, welche Dienste der Anbieter bereitstellt, müssen aber nicht wissen, worauf sie angewiesen sind, und Dienstanbieter müssen nicht „nutzen“. sie zufällig“ für Benutzer. „Beunruhigt durch Fehler, die durch den Dienst verursacht wurden.
Wie nutzt yii2 ServiceLocator? Tatsächlich ist es wie folgt ganz einfach:
//魔术方法, public function __get($name){ //得到某个注册的方法 if ($this->has($name)) { return $this->get($name); } else { return parent::__get($name); } } //魔术方法查看某个服务是否存在,源码略 public function __isset($name){} //__isset()中调用,查看某个服务是否存在,源码略 public function has($id, $checkInstance = false){} //得到某个服务 public function get($id, $throwException = true) { if (isset($this->_components[$id])) {//如果是已经处理的服务,就直接返回 return $this->_components[$id]; } if (isset($this->_definitions[$id])) {//如定义了该服务 $definition = $this->_definitions[$id];//得到服务的定义 //如果服务是一个闭包,则把闭包注册到已经实例化的服务中,并且返回闭包 if (is_object($definition) && !$definition instanceof Closure) { return $this->_components[$id] = $definition; } else {//其他的情况下通过依赖注入生成对象,并且注册为已处理,返回对象 return $this->_components[$id] = Yii::createObject($definition); } } elseif ($throwException) {//如果抛出异常,则抛出异常 throw new InvalidConfigException("Unknown component ID: $id"); } else {//其他返回null return null; } } //注册一个服务 public function set($id, $definition) { if ($definition === null) {//如果该服务的定义为null,则删除已经实例化的服务,返回空,用于注销已经实例化的并且保存过的服务的定义 unset($this->_components[$id], $this->_definitions[$id]); return; } //清空已经实例化的服务 unset($this->_components[$id]); //如果该服务的定义为一个对象,并且是一个可调用的结构 if (is_object($definition) || is_callable($definition, true)) { // an object, a class name, or a PHP callable $this->_definitions[$id] = $definition; } elseif (is_array($definition)) {//如果该服务是一个配置数组 // a configuration array if (isset($definition['class'])) {//如果有class键值,则直接注册为一个服务的定义 $this->_definitions[$id] = $definition; } else {//是配置数组,但是没有指定class,则抛出异常 throw new InvalidConfigException("The configuration for the \"$id\" component must contain a \"class\" element."); } } else {//什么都不是,抛出异常,非法注册服务 throw new InvalidConfigException("Unexpected configuration type for the \"$id\" component: " . gettype($definition)); } } //清空已经实例化过的服务和定义,代码略 public function clear($id){} //得到已经实例化后的服务,或者得到可用的服务配置 public function getComponents($returnDefinitions = true){} //注册所有的服务,这里的$components,就是你在config里写的 $config['components']值 public function setComponents($components){}
Wann kam ServiceLocator ins Spiel? Öffnen wir weiterhin unsere index.php und achten Sie auf den folgenden Satz
(new yii\web\Application($config))->run();
Schauen wir uns die Anwendung an
class Application extends \yii\base\Application //继续追踪 \yii\base\Application abstract class Application extends Module //继续追踪 Module class Module extends ServiceLocator
yii verwendet die Funktion set[typename], um die Beschreibbarkeit von Attributen sicherzustellen. Yii::configure($this, $config) wird im Konstruktor der Basisklasse yiibaseObject verwendet; dadurch wird die Funktionsregistrierung setComponents aufgerufen Aufschlag.
Okay, wir haben uns vorher und nachher kontaktiert. Das ist alles für die von yii2 verwendete Abhängigkeitsinjektion und den Service Locator.
Das Obige ist der yii2-Aufsatz (7) Abhängigkeitsinjektion – (4) Der Inhalt des Service Locators. Für weitere verwandte Inhalte zahlen Sie bitte Achtung auf die chinesische PHP-Website (www.php.cn)!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Dieser Artikel führt Sie durch die Abhängigkeitsinjektion, stellt die durch die Abhängigkeitsinjektion gelösten Probleme und ihre native Schreibmethode vor und spricht über das Abhängigkeitsinjektions-Framework von Angular. Ich hoffe, es wird Ihnen hilfreich sein!

Einführung in die Methode zur Verwendung der Abhängigkeitsinjektion (DependencyInjection) im Phalcon-Framework: In der modernen Softwareentwicklung ist die Abhängigkeitsinjektion (DependencyInjection) ein gängiges Entwurfsmuster, das darauf abzielt, die Wartbarkeit und Testbarkeit des Codes zu verbessern. Als schnelles und kostengünstiges PHP-Framework unterstützt das Phalcon-Framework auch die Verwendung von Abhängigkeitsinjektion zur Verwaltung und Organisation von Anwendungsabhängigkeiten. In diesem Artikel erfahren Sie, wie Sie das Phalcon-Framework verwenden

So entfernen Sie jquery aus yii2: 1. Bearbeiten Sie die Datei AppAsset.php und kommentieren Sie den Wert „yii\web\YiiAsset“ in der Variablen $depends aus. 2. Bearbeiten Sie die Datei main.php und fügen Sie die Konfiguration als „'yii“ hinzu. unter dem Feld „components“ \web\JqueryAsset' => ['js' => [],'sourcePath' => null,]“, um das JQuery-Skript zu entfernen.

In Go wird der Abhängigkeitsinjektionsmodus (DI) durch die Übergabe von Funktionsparametern implementiert, einschließlich der Übergabe von Werten und Zeigern. Im DI-Muster werden Abhängigkeiten typischerweise als Zeiger übergeben, um die Entkopplung zu verbessern, Sperrenkonflikte zu reduzieren und die Testbarkeit zu unterstützen. Durch die Verwendung von Zeigern wird die Funktion von der konkreten Implementierung entkoppelt, da sie nur vom Schnittstellentyp abhängt. Durch die Zeigerübergabe wird auch der Overhead für die Übergabe großer Objekte reduziert, wodurch Sperrenkonflikte reduziert werden. Darüber hinaus erleichtert das DI-Muster das Schreiben von Komponententests für Funktionen mithilfe des DI-Musters, da Abhängigkeiten leicht simuliert werden können.

Zum Testen der Abhängigkeitsinjektion mit JUnit lautet die Zusammenfassung wie folgt: Verwenden Sie Scheinobjekte, um Abhängigkeiten zu erstellen: Die @Mock-Annotation kann Scheinobjekte von Abhängigkeiten erstellen. Testdaten festlegen: Die @Before-Methode wird vor jeder Testmethode ausgeführt und zum Festlegen von Testdaten verwendet. Scheinverhalten konfigurieren: Die Methode Mockito.when() konfiguriert das erwartete Verhalten des Scheinobjekts. Ergebnisse überprüfen: affirmEquals() prüft, ob die tatsächlichen Ergebnisse mit den erwarteten Werten übereinstimmen. Praktische Anwendung: Sie können ein Abhängigkeitsinjektions-Framework (z. B. Spring Framework) verwenden, um Abhängigkeiten zu injizieren und die Richtigkeit der Injektion und den normalen Betrieb des Codes durch JUnit-Einheitentests zu überprüfen.

Antwort: Abhängigkeitsinjektion und Servicecontainer in PHP helfen dabei, Abhängigkeiten flexibel zu verwalten und die Testbarkeit des Codes zu verbessern. Abhängigkeitsinjektion: Abhängigkeiten durch den Container leiten, um eine direkte Erstellung innerhalb der Funktion zu vermeiden und so die Flexibilität zu verbessern. Service-Container: Speichert Abhängigkeitsinstanzen für einen einfachen Zugriff im Programm, wodurch die lose Kopplung weiter verbessert wird. Praktischer Fall: Die Beispielanwendung demonstriert die praktische Anwendung von Abhängigkeitsinjektion und Servicecontainern, wobei Abhängigkeiten in den Controller eingefügt werden, was die Vorteile der losen Kopplung widerspiegelt.

Die Verwendung von Dependency Injection (DI) beim Golang-Unit-Testen kann den zu testenden Code isolieren und so die Testeinrichtung und -wartung vereinfachen. Zu den beliebten DI-Bibliotheken gehören Wire und Go-Inject, die Abhängigkeits-Stubs oder Mocks zum Testen generieren können. Zu den Schritten des DI-Tests gehören das Festlegen von Abhängigkeiten, das Einrichten von Testfällen und das Durchführen von Ergebnissen. Ein Beispiel für die Verwendung von DI zum Testen einer HTTP-Anforderungsverarbeitungsfunktion zeigt, wie einfach es ist, Code ohne tatsächliche Abhängigkeiten oder Kommunikation zu isolieren und zu testen.

Antwort: In der Go-Sprache kann die Abhängigkeitsinjektion über Schnittstellen und Strukturen implementiert werden. Definieren Sie eine Schnittstelle, die das Verhalten von Abhängigkeiten beschreibt. Erstellen Sie eine Struktur, die diese Schnittstelle implementiert. Fügen Sie Abhängigkeiten über Schnittstellen als Parameter in Funktionen ein. Ermöglicht das einfache Ersetzen von Abhängigkeiten in Tests oder anderen Szenarien.
