AngularJS : quelles différences entre les notions de Service, de Provider et de Factory ?
Les services, providers et factories permettent tous les 3 d'obtenir un objet JavaScript. Si leur but est le même, leur syntaxe diffère légèrement.
Dans AngularJS, les services, providers et factories permettent tous les 3 d'obtenir un objet JavaScript à utiliser dans le code. Si leur but est le même, leur syntaxe diffère légèrement, et ils ne sont pas configurables de la même manière. L'objet le plus complet est le provider. Le service et la factory dérivent du provider, et sont donc utilisés pour proposer une écriture plus simple du provider. L'utilisation de l'un ou l'autre dépend donc de la manière dont vous souhaitez configurer l'objet.
Le provider fournit un objet instancié par le constructeur et sur lequel la méthode $get est appelée. On peut donc personnaliser l'objet en lui affectant des attributs, d'autres fonctions, et la méthode $get qui sera obligatoirement appelée.
myApp.provider('test', function() { this.nom = 'Objet'; //La fonction $get sera appelée obligatoirement. //Si l'on souhaite appeler d'autres providers ou services ou factories, on ne peut le faire que dans cette fonction. this.$get = function() { return { direBonjour : function(nom) { return Bonjour, + nom + !; } } }; this.setNom = function(name) { this.nom = nom; }; });
Une factory est une syntaxe simplifiée du provider. L'objet est instancié avec la valeur retournée par la fonction passée en paramètre. Il n'y a donc pas d'attributs, l'objet est géré directement par la fonction.
myApp.factory('test', function() { return { //On utilise ici un tableau pour ajouter à la fois des valeurs et des fonctions. nom : Objet, direBonjour : function(nom) { return Bonjour, + nom + !; } } });
Le service est une autre syntaxe simplifiée du provider. Elle diffère de la factory dans son écriture. La fonction passée en paramètre est appelée comme un constructeur (new fonction()). L'écriture est alors plus orientée objet et proche du provider.
myApp.factory('test', function() { //Le mot clé $this désigne alors l'objet en lui-même. this.nom = Objet; this.direBonjour = function(nom) { return Bonjour, + nom + !; } });