AngularJS: Servicio vs. Proveedor vs. Fábrica
¿Cuáles son las diferencias entre un Service
, Provider
y Factory
en AngularJS?
3291
3
¿Cuáles son las diferencias entre un Service
, Provider
y Factory
en AngularJS?
De la lista de correo de AngularJS conseguí un hilo increíble que explica servicio vs fábrica vs proveedor y su uso de inyección. Recopilando las respuestas:
Servicios
Sintaxis:
module.service( 'serviceName', function );
Resultado: Al declarar serviceName como argumento inyectable se le proporcionará una instancia de la función. En otras palabras
nueva FunciónTuServicio()
.Fábricas
Sintaxis:
module.factory( 'factoryName', function );
Resultado: Al declarar factoryName como argumento inyectable se le proporcionará el valor que se devuelve al invocar la referencia de la función pasada a module.factory.
Proveedores
Sintaxis:
module.provider( 'providerName', function );
Resultado: Al declarar providerName como argumento inyectable se le proporcionará
(new ProviderFunction()).$get()
. La función constructora es instanciada antes de llamar al método $get -ProviderFunction
es la referencia de la función pasada a module.provider.Los proveedores tienen la ventaja de que pueden ser configurados durante la fase de configuración del módulo.
Ver aquí para el código proporcionado.
Aquí hay una gran explicación adicional de Misko:
En este caso el inyector simplemente devuelve el valor tal cual. ¿Pero qué pasa si quieres calcular el valor? Entonces utilice una fábrica
Así que
factory
es una función que se encarga de crear el valor. Observe que la función de fábrica puede pedir otras dependencias.¿Pero qué pasa si quieres ser más OO y tener una clase llamada Greeter?
Entonces para instanciar tendrías que escribir
Entonces podríamos pedir 'greeter' en el controlador así
Pero eso es demasiado extenso. Una forma más corta de escribir esto sería
provider.service('greeter', Greeter);
¿Pero qué pasa si queremos configurar la clase
Greeter
antes de la inyección? Entonces podríamos escribirEntonces podemos hacer esto:
Como nota al margen,
service
,factory
, yvalue
son todos derivados de provider.[JS Fiddle Demo][1]
" Hello world " ejemplo con
factory
/service
/provider
:Me he dado cuenta de algo interesante al jugar con los proveedores.
La visibilidad de los inyectables es diferente para los proveedores que para los servicios y las fábricas. Si declaras una "constante" de AngularJS (por ejemplo,
myApp.constant('a', 'Robert');
), puedes inyectarla en servicios, fábricas y proveedores.Pero si declaras un "valor" AngularJS (por ejemplo,
myApp.value('b', {nombre: 'Jones'});
), puedes inyectarlo en servicios y fábricas, pero NO en la función de creación de proveedores. Sin embargo, puedes inyectarla en la función$get
que defines para tu proveedor. Esto se menciona en la documentación de AngularJS, pero es fácil de pasar por alto. Puedes encontrarlo en la página de %provide en las secciones de los métodos value y constant.http://jsfiddle.net/R2Frv/1/