AngularJS: fabbrica e servizio?

EDIT gen 2016: poiché questo ottiene ancora attenzione. Da quando ho chiesto questo, ho completato alcuni progetti di AngularJS e, per quelli che ho utilizzato principalmente come factory , ho creato un object e restituito l’object alla fine. Le mie dichiarazioni di seguito sono ancora vere, tuttavia.

EDIT: Penso di aver finalmente capito la differenza principale tra i due, e ho un esempio di codice da dimostrare. Penso anche che questa domanda sia diversa dal duplicato proposto. Il duplicato dice che il servizio non è istantaneo, ma se lo si imposta come ho dimostrato di seguito, in realtà lo è. Un servizio può essere impostato per essere esattamente uguale a una fabbrica. Fornirò anche un codice che mostra dove la fabbrica fallisce nel servizio, che non sembra rispondere ad altre risposte.

Se configuro VaderService in questo modo (cioè come servizio):

 var module = angular.module('MyApp.services', []); module.service('VaderService', function() { this.speak = function (name) { return 'Join the dark side ' + name; } }); 

Quindi nel mio controller posso farlo:

 module.controller('StarWarsController', function($scope, VaderService) { $scope.luke = VaderService.speak('luke'); }); 

Con il servizio, il VaderService immesso nel controller viene istanziato, quindi posso semplicemente chiamare VaderService.speak, tuttavia, se cambio VaderService in module.factory, il codice nel controller non funzionerà più , e questa è la differenza principale . Con factory, VaderService immesso nel controller non viene istanziato, motivo per cui è necessario restituire un object quando si imposta un factory (vedere il mio esempio nella domanda).

Tuttavia, è ansible impostare un servizio nello stesso modo in cui è ansible impostare una fabbrica (IE farlo restituire un object) e il servizio si comporta esattamente come una fabbrica

Date queste informazioni, non vedo alcun motivo per utilizzare la fabbrica sul servizio, il servizio può fare tutto ciò che la fabbrica può e altro ancora.

Domanda originale di seguito


So che questo è stato chiesto un sacco di volte, ma davvero non riesco a vedere alcuna differenza funzionale tra fabbriche e servizi. Ho letto questo tutorial: http://blogs.clevertech.biz/startupblog/angularjs-factory-service-provider

E sembra dare una spiegazione abbastanza buona, tuttavia, ho impostato la mia app come segue:

index.html

    My App       
{{luke}}

app.js:

 angular.module('MyApp', [ 'MyApp.services', 'MyApp.controllers' ]); 

controllers.js:

 var module = angular.module('MyApp.controllers', []); module.controller('StarWarsController', function($scope, VaderService) { var luke = new VaderService('luke'); $scope.luke = luke.speak(); }); 

VaderService.js

 var module = angular.module('MyApp.services', []); module.factory('VaderService', function() { var VaderClass = function(padawan) { this.name = padawan; this.speak = function () { return 'Join the dark side ' + this.name; } } return VaderClass; }); 

Quindi quando carico index.html, vedo “Unisciti al lato oscuro”, ottimo. Esattamente come previsto. Comunque se cambio VaderService.js in questo (nota module.service invece di module.factory):

 var module = angular.module('MyApp.services', []); module.service('VaderService', function() { var VaderClass = function(padawan) { this.name = padawan; this.speak = function () { return 'Join the dark side ' + this.name; } } return VaderClass; }); 

Quindi ricaricare index.html (mi sono assicurato di aver svuotato la cache e fatto una forte ricarica). Funziona esattamente come con module.factory. Quindi qual è la vera differenza funzionale tra i due ??

Servizio vs fabbrica


inserisci la descrizione dell'immagine quiinserisci la descrizione dell'immagine qui

La differenza tra fabbrica e servizio è esattamente come la differenza tra una funzione e un object

Fornitore di fabbrica

  • Fornisce il valore di ritorno della funzione, ad es. Basta creare un object, aggiungervi proprietà, quindi restituire lo stesso object. Quando si passa questo servizio nel controller, tali proprietà sull’object saranno ora disponibili in quel controller attraverso la fabbrica. (Scenario ipotetico)

  • Singleton e verrà creato solo una volta

  • Componenti riutilizzabili

  • Factory è un ottimo modo per comunicare tra controller come la condivisione di dati.

  • Può usare altre dipendenze

  • Solitamente utilizzato quando l’istanza del servizio richiede una logica di creazione complessa

  • Non può essere iniettato nella funzione .config() .

  • Utilizzato per servizi non configurabili

  • Se si sta utilizzando un object, è ansible utilizzare il fornitore di fabbrica.

  • Sintassi: module.factory('factoryName', function);

Fornitore di servizi

  • Forniscici l’istanza di una funzione (object): hai appena creato un’istanza con la parola chiave ‘nuova’ e aggiungerai proprietà a ‘this’ e il servizio restituirà ‘this’.Quando si passa il servizio nel controller, tali proprietà su “questo” sarà ora disponibile su quel controller attraverso il tuo servizio. (Scenario ipotetico)

  • Singleton e verrà creato solo una volta

  • Componenti riutilizzabili

  • I servizi vengono utilizzati per la comunicazione tra i controllori per condividere i dati

  • È ansible aggiungere proprietà e funzioni a un object servizio utilizzando la parola chiave this

  • Le dipendenze sono iniettate come argomenti del costruttore

  • Utilizzato per la logica di creazione semplice

  • Non può essere iniettato nella funzione .config() .

  • Se stai usando un corso potresti usare il fornitore di servizi

  • Sintassi: module.service('serviceName', function);

Demo di esempio

Nell’esempio seguente ho definito MyService e MyFactory . Si noti come in .service ho creato i metodi di servizio usando this.methodname. In .factory ho creato un object factory e gli ho assegnato i metodi.

AngularJS .service


 module.service('MyService', function() { this.method1 = function() { //..method1 logic } this.method2 = function() { //..method2 logic } }); 

AngularJS .factory


 module.factory('MyFactory', function() { var factory = {}; factory.method1 = function() { //..method1 logic } factory.method2 = function() { //..method2 logic } return factory; }); 

Dai anche un’occhiata a questo bellissimo materiale

Confuso riguardo servizio vs fabbrica

Fabbrica, servizio e fornitore di AngularJS

Angular.js: service vs provider vs factory?

Factory and Service è un semplice wrapper di un provider .

Fabbrica

Factory può restituire qualsiasi cosa che può essere una class(constructor function) , instance of class , una string , un number o un valore boolean . Se si restituisce una funzione di constructor , è ansible creare un’istanza nel controller.

  myApp.factory('myFactory', function () { // any logic here.. // Return any thing. Here it is object return { name: 'Joe' } } 

Servizio

Il servizio non ha bisogno di restituire nulla. Ma devi assegnare tutto in this variabile. Perché il servizio creerà l’istanza per impostazione predefinita e la userà come object base.

 myApp.service('myService', function () { // any logic here.. this.name = 'Joe'; } 

Codice angularjs effettivo dietro il servizio

 function service(name, constructor) { return factory(name, ['$injector', function($injector) { return $injector.instantiate(constructor); }]); } 

È solo un involucro attorno alla factory . Se restituisci qualcosa dal service , si comporterà come Factory .

IMPORTANT : il risultato della restituzione di Factory e Service sarà cache e lo stesso verrà restituito per tutti i controller.

Quando dovrei usarli?

Factory è in gran parte preferibile in tutti i casi. Può essere utilizzato quando si ha una funzione di constructor che deve essere istanziata in diversi controller.

Service è una specie di object Singleton . Il ritorno dell’object dal servizio sarà lo stesso per tutti i controller. Può essere utilizzato quando si desidera avere un singolo object per l’intera applicazione. Ad esempio: dettagli utente autenticati.

Per ulteriori informazioni, leggi

http://iffycan.blogspot.in/2013/05/angular-service-or-factory.html

http://viralpatel.net/blogs/angularjs-service-factory-tutorial/

  • Se si utilizza un servizio si otterrà l’istanza di una funzione (“questa” parola chiave).
  • Se usi una fabbrica otterrai il valore che viene restituito invocando il riferimento alla funzione (la dichiarazione di reso in fabbrica)

La fabbrica e il servizio sono le ricette più utilizzate. L’unica differenza tra loro è che la ricetta di servizio funziona meglio per oggetti di tipo personalizzato, mentre Factory può produrre primitive e funzioni JavaScript.

Riferimento

$ fornire un servizio

Sono tecnicamente la stessa cosa, in realtà è una notazione diversa dell’utilizzo della funzione provider del servizio $provide .

  • Se stai usando una class: potresti usare la notazione del servizio .
  • Se stai usando un object: potresti usare la notazione di fabbrica .

L’ unica differenza tra il service e la notazione di factory è che il servizio è nuovo e la fabbrica no. Ma per tutto il resto entrambi guardano , annusano e si comportano allo stesso modo. Di nuovo, è solo una scorciatoia per la funzione $ provide.provider .

 // Factory angular.module('myApp').factory('myFactory', function() { var _myPrivateValue = 123; return { privateValue: function() { return _myPrivateValue; } }; }); // Service function MyService() { this._myPrivateValue = 123; } MyService.prototype.privateValue = function() { return this._myPrivateValue; }; angular.module('myApp').service('MyService', MyService);