Bitte ertrage es hier mit mir. Ich weiß, dass es andere Antworten gibt, wie zum Beispiel: AngularJS: Service gegen Anbieter gegen Fabrik
Ich kann jedoch immer noch nicht herausfinden, wann Sie den Service über die Fabrik nutzen würden.
Soweit ich weiß, wird Factory häufig verwendet, um "allgemeine" Funktionen zu erstellen, die von mehreren Controllern aufgerufen werden können: Erstellen gemeinsamer Controller-Funktionen
Die Angular-Dokumente scheinen die Fabrik dem Service vorzuziehen. Sie beziehen sich sogar auf "Service", wenn sie die Fabrik benutzen, was noch verwirrender ist! http://docs.angularjs.org/guide/dev_guide.services.creating_services
Wann würde man den Service nutzen?
Gibt es etwas, das nur mit Service möglich oder viel einfacher ist?
Gibt es etwas anderes, das sich hinter den Kulissen abspielt? Leistungs- / Speicherunterschiede?
Hier ist ein Beispiel. Abgesehen von der Deklarationsmethode scheinen sie identisch zu sein, und ich kann nicht herausfinden, warum ich eins gegen das andere mache. http://jsfiddle.net/uEpkE/
Update: Aus Thomas 'Antwort geht hervor, dass der Service für eine einfachere Logik und die Factory für eine komplexere Logik mit privaten Methoden gedacht ist. Deshalb habe ich den folgenden Geigencode aktualisiert und es scheint, dass beide private Funktionen unterstützen können.
myApp.factory('fooFactory', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo; }
return {
setFoobar: function(foo){
addHi(foo);
},
getFoobar:function(){
return fooVar;
}
};
});
myApp.service('fooService', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo;}
this.setFoobar = function(foo){
addHi(foo);
}
this.getFoobar = function(){
return fooVar;
}
});
function MyCtrl($scope, fooService, fooFactory) {
fooFactory.setFoobar("fooFactory");
fooService.setFoobar("fooService");
//foobars = "Hi fooFactory, Hi fooService"
$scope.foobars = [
fooFactory.getFoobar(),
fooService.getFoobar()
];
}
quelle
Antworten:
Erläuterung
Sie haben hier verschiedene Dinge:
Zuerst:
this
Schlüsselwort " ").ref: angle.service vs angle.factory
Zweite:
Denken Sie daran, dass alle Anbieter in AngularJS (Wert, Konstante, Dienstleistungen, Fabriken) Singletons sind!
Dritte:
Bei der Verwendung des einen oder anderen (Service oder Fabrik) geht es um den Codestil. Aber der gemeinsame Weg ist in AngularJS verwenden Fabrik .
Warum ?
( Ref : http://www.amazon.com/Mastering-Web-Application-Development-AngularJS/dp/1782161821 ).
Verwendung
Service: Kann nützlich sein, um Dienstprogrammfunktionen freizugeben, die durch einfaches Anhängen
()
an die Referenz der injizierten Funktion aufgerufen werden können. Könnte auch mitinjectedArg.call(this)
oder ähnlich ausgeführt werden.Factory: Kann nützlich sein, um eine 'Klassen'-Funktion zurückzugeben, die dann neu erstellt werden kann, um Instanzen zu erstellen.
So verwenden Sie eine Fabrik , wenn Sie komplexe Logik in Ihrem Service und Sie nicht wollen , um diese Komplexität aussetzen .
In anderen Fällen, wenn Sie eine Instanz eines Dienstes zurückgeben möchten, verwenden Sie einfach den Dienst .
Aber Sie werden mit der Zeit sehen, dass Sie in 80% der Fälle, glaube ich, die Fabrik verwenden werden.
Für weitere Informationen: http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory-with-example/
UPDATE:
Ausgezeichneter Beitrag hier: http://iffycan.blogspot.com.ar/2013/05/angular-service-or-factory.html
UPDATE:
Das AngularJS-Team macht seine Arbeit und gibt eine Erklärung: http://docs.angularjs.org/guide/providers
Und von dieser Seite:
quelle
allernhwkim hat ursprünglich eine Antwort auf diese Frage gepostet , die auf seinen Blog verweist. Ein Moderator hat sie jedoch gelöscht. Es ist der einzige Beitrag, den ich gefunden habe, der Ihnen nicht nur sagt, wie Sie dasselbe mit Service, Provider und Factory machen, sondern auch, was Sie mit einem Provider machen können, den Sie mit einer Factory nicht können, und mit Eine Fabrik, die man mit einem Service nicht erreichen kann.
Direkt aus seinem Blog:
Dies zeigt, wie der CarService immer ein Auto mit 4 Zylindern produziert, Sie können es nicht für einzelne Autos ändern. Während CarFactory eine Funktion zurückgibt, die Sie
new CarFactory
in Ihrem Controller ausführen können, geben Sie eine Reihe von Zylindern ein, die für dieses Auto spezifisch sind. Das kannst du nicht machennew CarService
da CarService ein Objekt und keine Funktion ist.Die Gründe, warum Fabriken nicht so funktionieren:
Und automatisch eine Funktion zurückgeben, die Sie instanziieren können, weil Sie dies dann nicht tun können (fügen Sie dem Prototyp / etc Dinge hinzu):
Sehen Sie, wie es buchstäblich eine Fabrik ist, die ein Auto produziert.
Das Fazit aus seinem Blog ist ziemlich gut:
Wenn Sie feststellen, dass Sie nur ein Objekt in der Fabrik zurückgeben, sollten Sie wahrscheinlich den Dienst verwenden.
Tu das nicht:
Verwenden Sie stattdessen den Service:
quelle
Das Konzept für all diese Anbieter ist viel einfacher als es zunächst erscheint. Wenn Sie einen Anbieter sezieren und die verschiedenen Teile herausziehen, wird dies sehr deutlich.
Um es einfach auszudrücken jede dieser Anbieter ist eine spezielle Version des anderen, in dieser Reihenfolge:
provider
>factory
>value
/constant
/service
.Solange der Anbieter tut, was Sie können, können Sie den Anbieter weiter unten in der Kette verwenden, was dazu führen würde, dass weniger Code geschrieben wird. Wenn es nicht das erreicht, was Sie wollen, können Sie die Kette hochgehen und müssen nur mehr Code schreiben.
Dieses Bild zeigt, was ich meine. In diesem Bild sehen Sie den Code für einen Anbieter. Die hervorgehobenen Teile zeigen Ihnen, welche Teile des Anbieters stattdessen zum Erstellen einer Fabrik, eines Werts usw. verwendet werden könnten.
(Quelle: simplygoodcode.com )
Weitere Details und Beispiele aus dem Blog-Beitrag, von dem ich das Bild erhalten habe, finden Sie unter: http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/
quelle
Sowohl die Factory als auch der Service führen zu Singleton-Objekten, die von Anbietern konfiguriert und in Controller und Ausführungsblöcke eingefügt werden können. Aus Sicht des Injektors gibt es absolut keinen Unterschied, ob das Objekt aus einer Fabrik oder einer Dienstleistung stammt.
Wann sollte eine Fabrik und wann ein Service genutzt werden? Es läuft auf Ihre Codierungspräferenz hinaus und auf nichts anderes. Wenn Sie das modulare JS-Muster mögen, gehen Sie zur Fabrik. Wenn Ihnen der Stil der Konstruktorfunktion ("Klasse") gefällt, wählen Sie den Dienst. Beachten Sie, dass beide Stile private Mitglieder unterstützen.
Der Vorteil des Dienstes könnte darin bestehen, dass er aus OOP-Sicht intuitiver ist: Erstellen Sie eine "Klasse" und verwenden Sie in Verbindung mit einem Anbieter denselben Code modulübergreifend wieder, und variieren Sie das Verhalten der instanziierten Objekte einfach durch Angabe verschiedene Parameter zum Konstruktor in einem Konfigurationsblock.
quelle
Es gibt nichts, was eine Fabrik im Vergleich zu einem Service nicht kann oder besser kann. Und umgekehrt. Fabrik scheint nur populärer zu sein. Der Grund dafür ist die Bequemlichkeit im Umgang mit privaten / öffentlichen Mitgliedern. Der Service wäre in dieser Hinsicht ungeschickter. Wenn Sie einen Dienst codieren, neigen Sie dazu, Ihre Objektmitglieder über das Schlüsselwort "this" öffentlich zu machen, und stellen möglicherweise plötzlich fest, dass diese öffentlichen Mitglieder für private Methoden (dh innere Funktionen) nicht sichtbar sind.
Angular verwendet das Schlüsselwort "new", um einen Dienst für Sie zu erstellen, sodass die Instanz, die Angular an den Controller übergibt, denselben Nachteil hat. Natürlich können Sie das Problem überwinden, indem Sie Folgendes verwenden:
Aber mit einer großen Service-Konstante würde dies den Code schlecht lesbar machen. Darüber hinaus werden die Service-Prototypen keine privaten Mitglieder sehen - nur öffentliche werden ihnen zur Verfügung stehen:
Zusammenfassend ist die Verwendung von Factory bequemer. As Factory hat diese Nachteile nicht. Ich würde empfehlen, es standardmäßig zu verwenden.
quelle
myapp.service(...)
fehlt der Kontext des Aufrufs vollständig. Wonew Service()
soll aufgerufen werden, in der Servicefunktion oder an der Stelle, an der der Service injiziert wird. Die dritte Auflistung ist im Kontext von einfach nicht möglichmyapp.service ('Service', function() {...})
.Selbst wenn sie sagen, dass alle Dienstleistungen und Fabriken Singleton sind, stimme ich dem nicht zu 100 Prozent zu. Ich würde sagen, dass Fabriken keine Singletons sind und das ist der Punkt meiner Antwort. Ich würde wirklich über den Namen nachdenken, der jede Komponente definiert (Service / Fabrik), ich meine:
Eine Fabrik , da ist kein Singleton, können Sie so viele erstellen , wie Sie wollen , wenn Sie injizieren, so dass es wie eine Fabrik von Objekten arbeitet. Sie können eine Factory einer Entität Ihrer Domäne erstellen und bequemer mit diesen Objekten arbeiten, die wie ein Objekt Ihres Modells sein können. Wenn Sie mehrere Objekte abrufen, können Sie sie in diesen Objekten zuordnen und es kann eine Art andere Ebene zwischen dem DDBB- und dem AngularJs-Modell fungieren. Sie können den Objekten Methoden hinzufügen, sodass Sie sich ein wenig mehr an Objekten orientieren als an Ihrer AngularJs-App.
In der Zwischenzeit ist ein Dienst ein Singleton, sodass wir nur eine Instanz erstellen können, möglicherweise nicht, aber wir haben nur eine Instanz, wenn wir einen Controller einfügen. Daher bietet ein Dienst eher einen allgemeinen Dienst (Restaufrufe, Funktionalität ..). zu den Controllern.
Konzeptionell kann man denken, dass Services einen Service bereitstellen. Fabriken können mehrere Instanzen (Objekte) einer Klasse erstellen
quelle
Dienstleistungen
Syntax : module.service ('serviceName', Funktion); Ergebnis : Wenn Sie serviceName als injizierbares Argument deklarieren, erhalten Sie die tatsächliche Funktionsreferenz, die an module.service übergeben wird.
Verwendung : Kann nützlich sein, um Dienstprogrammfunktionen freizugeben, die zum Aufrufen nützlich sind, indem einfach () an die Referenz der injizierten Funktion angehängt wird. Könnte auch mit injiziertemArg.call (this) oder ähnlichem ausgeführt werden.
Fabriken
Syntax : module.factory ('factoryName', Funktion);
Ergebnis : Wenn Sie factoryName als injizierbares Argument deklarieren, erhalten Sie den Wert, der durch Aufrufen der an module.factory übergebenen Funktionsreferenz zurückgegeben wird.
Verwendung : Kann nützlich sein, um eine 'Klassen'-Funktion zurückzugeben, die dann neu erstellt werden kann, um Instanzen zu erstellen.
Anbieter
Syntax : module.provider ('providerName', Funktion);
Ergebnis : Wenn Sie providerName als injizierbares Argument deklarieren, erhalten Sie den Wert, der durch Aufrufen der $ get-Methode der an module.provider übergebenen Funktionsreferenz zurückgegeben wird.
Verwendung : Kann nützlich sein, um eine 'Klassen'-Funktion zurückzugeben, die dann neu erstellt werden kann, um Instanzen zu erstellen, für die jedoch vor dem Injizieren eine Konfiguration erforderlich ist. Vielleicht nützlich für Klassen, die projektübergreifend wiederverwendbar sind? Immer noch irgendwie dunstig.
quelle
Kann beides so verwenden, wie Sie möchten : ob Sie ein Objekt erstellen oder nur , um von beiden auf Funktionen zuzugreifen
Hinweis :
Hinweis :
Fazit :
quelle
Fabrik und Service sind die am häufigsten verwendete Methode. Der einzige Unterschied besteht darin, dass die Service-Methode für Objekte, die eine Vererbungshierarchie benötigen, besser funktioniert, während die Factory JavaScript-Grundelemente und -Funktionen erstellen kann.
Die Provider-Funktion ist die Kernmethode und alle anderen sind nur syntaktischer Zucker. Sie benötigen es nur, wenn Sie einen wiederverwendbaren Code erstellen, der global konfiguriert werden muss.
Es gibt fünf Methoden zum Erstellen von Diensten: Wert, Fabrik, Dienst, Anbieter und Konstante. Sie können mehr über diese hier erfahren Winkel Service , dieser Artikel alle diese Methoden mit praktischen Demo - Beispiele erläutern.
.
quelle