Das ist etwas worüber ich während der Erstellung einer AngularJS App nachgedacht habe. Als ich zum ersten Mal von AngularJS Fabriken gelernt, dachte ich eine kluge Nutzung von ihnen wäre zu erstellen und eine Konstruktorfunktion eher als ein einfaches Objekt zurück, das heißt so etwas wie:AngularJS-Entwurfsmuster: Soll ich Konstruktoren verwenden, um Konstruktorfunktionen zu erstellen?
app.factory("Foo", function() {
function Foo(bar, baz) {
this.bar = bar;
this.baz = baz;
...
}
Foo.prototype = {
constructor: Foo,
method1: function() { ... },
method2: function() { ... },
...,
methodn: function() { ... },
};
return Foo;
});
Dann könnten Sie die Funktion in Ihr injizieren Controller und rufen Sie es mit new
. Ich fand das ästhetisch ansprechend und OOP-y, aber jetzt fange ich an zu denken, dass es eigentlich ein Anti-Muster ist. Das Problem ist, dass es gut funktioniert, wenn Sie in AngularJS-konformen Kontexten arbeiten, aber wenn Sie beispielsweise den Konstruktor von der Konsole aus aufrufen möchten, verwenden Sie ihn in einem Web Worker oder verwenden Sie den Code in einem nicht AngularJS App, Sie müssen anfangen zu arbeiten um AngularJS anstatt mit ihm. Ich begann mich zu fragen, ob diese Herangehensweise fehlgeleitet ist, da Funktionen in Javascript bereits "Singletons" zu sein scheinen und keine Hilfe benötigt werden, um instanziiert zu werden.
Verwende ich AngularJS-Fabriken? Wäre ich besser mit Konstruktorfunktionen ausgestattet, die dem globalen Geltungsbereich ausgesetzt sind? Gibt es allgemein spezifische Faktoren, die die Nutzung von AngularJS-Fabriken/-Dienstleistungen/-Anbietern gegenüber globalen Objekten oder umgekehrt fördern?
Anstatt den Wert der Abhängigkeitsauflösung, die von einem Dependency-Injection-Container bereitgestellt wird, kurzzuschließen, würde ich vorschlagen, nachzusehen bei der Dekoratormusterunterstützung OOTB von $ provider.decorator (...) in Angular-Dokumenten. Das Freilegen eines Prototyps ist nicht "böse", aber wenn Sie bei einer Komponente, die Abhängigkeiten aufweist, die Sie lösen, "neu" nennen, bin ich mir nicht sicher, was Sie gewinnen, außer vielleicht konfigurierbare Prototypen basierend auf einem Kontext. Wenn Sie danach suchen, können Sie $ inject.get ('myWhatever') verwenden, um es in Service Locator umzuwandeln. – SonOfNun
Es ist keine gute Idee. Die Idee einer Fabrik ist es, einen Wert zu liefern, ohne sich Gedanken darüber machen zu müssen, wie sie aufgebaut ist. [Diese Antwort gibt eine gute Erklärung zur Verwendung von Fabriken, Dienstleistungen und Anbietern] (http://stackoverflow.com/questions/15666048/angular-js-service-vs-provide-vs-factory). – Bart