angular.js - 如何通俗易懂的解释“依赖注入”?
ringa_lee
ringa_lee 2017-05-15 17:04:27
0
7
875

如何通俗易懂的解释“依赖注入”?另外,依赖注入和控制反转有区别吗?具体是什么区别?

ringa_lee
ringa_lee

ringa_lee

répondre à tous(7)
黄舟

Les choses qui ont été écrites sont prêtes à l'emploi !

世界只因有你

Tout d'abord, qu'est-ce que la dépendance ? Un objet dépend d'autres objets. Par exemple, var d=new Date(); signifie que d dépend de la création de l'objet Date.
Deuxièmement, est-il préférable de dépendre. allumé ou pas ? non Afin d'obtenir un faible couplage du programme, il est préférable de minimiser l'interdépendance et les contraintes entre les composants. Par exemple, si un constructeur a été créé par d'autres, je peux l'appeler directement sans le recréer.
Troisièmement, qu'est-ce que l'injection ? Cela signifie que l’objet que j’utilise actuellement a été donné par d’autres et a été créé passivement. Par exemple

angular.module('M1',['ng','ngRoute'])
.controller('C1',function($scope,$http){
    $scope.data = 999;
    $http.get().success();    
})
这段代码运行时:只需要传入所需要的模块的名称,ng底层自动创建相关的对象,直接使用
阿神

Il n'y a pas de différence, juste des angles différents, ils font tous référence à la même chose. Pour faire simple, vous n'avez pas besoin de créer des objets vous-même, spring vous aidera à placer les objets là où vous en avez besoin

滿天的星座

C’est juste une sublimation du modèle d’usine.
Les principes de l'injection de dépendances et de l'inversion du code de contrôle sont la même chose, ils sont juste différents dans leur compréhension.

Ces termes sont vraiment trop avancés. En fait, ce ne sont que quelques applications de base orientées objet, qui ont dérouté de nombreux amis.
C'est la même chose que le modèle de stratégie et le modèle d'usine.

曾经蜡笔没有小新

Vous pouvez vous référer à : http://www.nowcoder.com/questionTerminal/3be16186465a453f876729acd2e46ddf

我想大声告诉你

Il n'y a essentiellement aucune différence entre l'injection de dépendances et l'inversion de contrôle, mais la perspective de décrire le problème est différente.

Inversion de contrôle :
Qu'est-ce qui est inversé exactement ? La définition de Wikipédia est que l'acquisition d'objets dépendants est inversée.
Les applications sont généralement composées de nombreux objets. De nombreuses autres classes doivent être utilisées dans une seule classe. Au départ, nous avons obtenu de manière proactive des instances d'autres classes via le nouveau mot-clé. Cela pose un problème : la relation d'appel de chaque classe est couplée.

Avec l'inversion de contrôle, il suffit d'attendre passivement que spring nous injecte l'instance de la classe, et nous pouvons l'utiliser directement.

Cela présente de nombreux avantages, comme la gestion centralisée des objets, pas besoin d'implémenter de nombreux singletons par vous-même, le découplage des relations d'appel des classes, etc.

Supposons qu'il y ait deux classes A et B. Si une instruction comme new B() est utilisée dans A, ajoutez une arête dirigée de B vers A. Un projet plus vaste peut comporter des milliers de classes, et le graphe orienté ainsi formé sera certainement extrêmement complexe. Si l’inversion de contrôle est utilisée, dans le cas le plus extrême, toutes nos classes deviendront des points indépendants.

Parce qu'il contrôle chaque bean, il peut également en dériver diverses fonctions puissantes.
spring est basé sur IoC et AOP.

迷茫

Il existe une classe de base de données db, qui a une méthode statique get_db() qui peut obtenir l'objet de connexion à la base de données.
Il existe également une classe post qui doit faire fonctionner la base de données, et elle a une méthode get_post() qui doit interroger la base de données.
La connexion à la base de données étant une opération publique, la classe post ne veut pas se reconnecter à la base de données en interne pour éviter le couplage.
La classe post fournit donc une méthode set_db() pour obtenir l'objet de connexion à la base de données.
db:: get_db() est passé dans la classe post en tant que paramètre de la méthode set_db() de la classe post.

<?php
class db {
    public static function get_db() {
        return new mysqli('127.0.0.1','user','pass','dbname',3306);
    }
}
class post {
    private $db;
    public function set_db($db){
        $this->db = $db;
    }
    public function get_post($id){
        return $this->db->query('SELECT * FROM post WHERE id ='.intval($id));
    }
}
$post = new post();
$post->set_db( db::get_db() ); //注入post类依赖的数据库连接对象
var_export( $post->get_post(1024) );

En comparant la méthode d'écriture ci-dessous, vous pouvez comprendre que l'injection de dépendances est en fait un patch pour certains langages complètement POO.

<?php
function db() {
    static $db;
    if ($db) {
        return $db;
    } else {
        $db = new mysqli('127.0.0.1','user','pass','dbname',3306);
        return $db;
    }
}
function get_post($id) {
    $db = db();
    return $db->query('SELECT * FROM post WHERE id ='.intval($id))->fetch_all();
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!