Quel est le type d'injection amicale?

Dans la documentation AngularJS, Il y a une explication des différences entre une usine, un service, une valeur, une constante et un fournisseur .

À la fin, nous avons un tableau de comparaison: Tableau de comparaison L'une des lignes est "type friendly injection". Je ne pouvais pas comprendre ce que c'est.

Qu'est-ce que cela signifie? De plus, qu'est-ce que cela signifie que, pour qu'une valeur ait cette "injection conviviale de type", c'est au prix d '" initialisation avide en utilisant new opérateur directement"?

27
demandé sur Blackhole 2014-09-04 17:54:37

4 réponses

Dans AngularJS, vous pouvez injecter des dépendances de plusieurs façons:

  • dans la directive link fonction par poste
  • dans la directive définition par nom
  • dans la fonction de contrôleur par nom
  • dans la fonction d'usine par nom
  • dans la fonction de service par type

Type friendly injection vous permet d'invoquer implicitement une fonction constructeur par référence:

myApp.service('Pattern', ["Infinity", RegExp]);

Plutôt que par l'utilisation explicite du new mot-clé:

myApp.factory('Pattern', 
 ["Infinity", function(Infinity) 
  {
  return new RegExp(Infinity);
  } 
 ]);

Ou

function goInfinity(Infinity)
  {
  return new RegExp(Infinity);
  } 

goInfinity.$inject = ["Infinity"];
myApp.factory('Pattern', goInfinity);

La recette de Service produit un service tout comme les recettes Value ou Factory, mais elle le fait en appelant un constructeur avec le nouvel opérateur. Le constructeur peut prendre zéro ou plusieurs arguments, qui représentent les dépendances nécessaires à l'instance de ce type.

L'initialisation impatiente signifie qu'une recette constant doit renvoyer un constructeur afin d'utiliser la syntaxe susmentionnée:

function RegExpConstant() 
  {
  return new RegExp(Infinity);
  } 

myApp.constant('Pattern', RegExpConstant)

Plutôt que de renvoyer un fonction, objet ou valeur littérale.

La nomenclature vient de Java:

Un service est un ensemble d'interfaces. Un fournisseur de services est une implémentation spécifique d'un service. Une fabrique est un objet qui renvoie une référence d'objet à un autre objet

Références à

11
répondu Paul Sweatte 2016-11-16 19:03:45

Mon interprétation de "type amical injection":

Les usines et les fournisseurs injectent tout ce qui est retourné par la fonction d'usine et la fonction $get respectivement, qui pourrait être de n'importe quel type et pourrait potentiellement changer dynamiquement au moment de l'exécution. Alors que les injections de Service, de constante et de valeur sont d'un type fixe dont Angular est conscient car il est bien défini lors de la définition de la recette. Par conséquent, ils sont des injections amicales de type.

9
répondu Anand 2014-09-23 11:59:28

Le Type ici fait référence à:

  • primitives,
  • littéraux d'objet,
  • fonctions, ou
  • même une instance d'un type personnalisé

Les usines et les fournisseurs sont les plus flexibles hors du service, constante, valeur en termes de ce qu'ils se lient à l'injecteur. Par conséquent Angular peut détecter le type d'objet / primitif qui est lié au Service, Constant, valeur donc plus conviviale puisque nous connaissons le type dès le départ (temps de conception/construction).

5
répondu bhantol 2014-09-16 17:38:41

Je me suis juste posé la même question en regardant la même table. :-)

Ma meilleure interprétation des valeurs de cette ligne de table est qu'elle signifie en fait ' Si vous pouvez savoir ce qui a créé l'instance de service à partir de l'instance de service elle-même', c'est-à-dire 'si la propriété constructor de l'instance de service est définie sur une fonction significative'.

Voici une interprétation plus détaillée pour chacun des recettes:

  • usine: pas de, mais peut-être oui si vous construisez la valeur retournée par l'appel de la new opérateur
  • service: Oui - référencera la fonction de recette de service
  • valeur/constant: oui, mais seulement si vous construisez la valeur par l'appel de la new opérateur
  • fournisseur: pas de, mais peut-être oui si vous construisez l' provider.$get de retour de la méthode en appelant l'opérateur new en interne)

En l'état actuel, cette partie de la documentation semble inachevée et il est possible que l'auteur ait eu plusieurs idées de ce qu'il voulait montrer ici, mais la documentation finale a réussi à glisser à travers les mailles du filet et a été publiée dans un état intermédiaire.

2
répondu Jurko Gospodnetić 2015-01-23 14:40:51