¡Esta es una revisión vieja del documento!
Por fin llegamos al provider
el último de los tipos de servicios en AngularJS y con el que espero que se entiendan por fin las diferencias entre todos ellos.
Un provider
es como un factory
solo que permite que se configure antes de crear el valor del servicio. En el tema anterior hemos visto el ejemplo del servicio de hash
que se configuraba a través de un value
llamado algoritmo
. Aunque el ejemplo ha funcionado, la verdad es que es un poco chapucero ya que aparentemente no hay relación entre algoritmo
y hash
. La relación entre ambos queda poco orientada al objeto. El provider
viene en nuestra ayuda creando un objeto previo que permite configurar el factory antes de que cree el valor del servicio. Este nuevo objeto se llama Provider y en un bloque config
podremos acceder a él para poder configurar nuestro servicio.
Como siempre hacemos veamos un ejemplo:
function HashProvider() { var _algoritmo=""; this.setAlgoritmo=function(algoritmo) { _algoritmo=algoritmo; }; this.$get=function() { var hashFunction; if (_algoritmo==="MD5") { hashFunction=CryptoJS.MD5; } else if (_algoritmo==="SHA-1") { hashFunction=CryptoJS.SHA1; } else if (_algoritmo==="SHA-2-256") { hashFunction=CryptoJS.SHA256; } else if (_algoritmo==="SHA-2-512") { hashFunction=CryptoJS.SHA512; } else { throw Error("El tipo de algoritmo no es válido:"+_algoritmo); } var hash=function(message) { var objHashResult=hashFunction(message); var strHashResult=objHashResult.toString(CryptoJS.enc.Base64); return strHashResult; } return hash; } } app.provider("hash",HashProvider);
HashProvider
. Posteriormente AngularJS creará una instancia de esta clase.algoritmo
la cual contendrá el algoritmo a usar.$get
. Es una obligación que impone AngularJS para que él sepa cual es el método factory. Podemos ver que este método es exactamente igual al del tema anterior de factory excepto que ahora usa la propiedad privada _algoritmo
en vez de llamar al servicio algoritmo
.provider
con el nombre hash
y le pasamos como argumento el nombre de la clase HashProvider
.
$get
se le pueden seguir inyectando servicios quedando de la siguiente forma:
this.$get=['serv1','serv2',function(serv1,serv2) { }];