Service & Factory Angular

Como todo proyecto organizado no podemos tener toda la logica y/o funcionalidades core en controladores y mucho menos en vistas, AngularJs tiene el concepto de Servicio esto lo implementan de 2 formas, Service y Factory, ambos podrian ser usados del la misma manera pero es bueno tener en cuenta como funcionan para así sacarles el mas provecho.

Antes de hablar de service y demás cosas es bueno saber que AngularJS maneja el concepto/funcionalidad de inyección de dependencia (dependency injection), Angular utiliza esto a la hora de requerir cierto componente desde cualquier parte de la aplicación este es inyectado a nuestro controlador (Digamos). Este concepto lo usamos desde el principio, un ves decimos en nuestro controlador:

//angularjs DI
    function mainController($scope){

    }
//

Lo que angular esta haciendo en este caso es inyectar una instancia del $scope a nuestro controlador, esta inyección no siempre sera la misma por ejemplo cuando inyecta $scope es un scope limpio digamos una instancia nueva mas sin embargo una vez inyectemos un servicio o factory sera la misma instancia en toda la aplicación.

Service

Los Servicios en angular son declarados de la forma app.service y son inyectados en los controladores u otros servicios o factorías. Un servicio se declara de la siguiente manera:

//
    var app = angularjs.module('test',[])

    app.service('ServiceName',function(){
        this.holaMundo = function(){
            // codigo magico
        }
    })
//

El servicio puede ser utilizado en un controlador de esta manera

//
    app.contorller('controllerName',function(ServiceName){
        ServiceName.holaMundo();
    })
//

De esta forma es como se declara y como se usa/consume un servicio con AngularJS, ahora si notan en el servicio estoy usando el keyword this que lo que esta haciendo es declarar una propiedad de esa objeto en esa función, esto es por que cuando AngularJS crea la instancia de mi servicio este lo hace usando “new MyService()” y de esa forma es que me retorna la instancia de mi servicio.

Factory

Las factorías en AngularJS son declaradas de forma app.factory y al igual que los servicio estos pueden tener dependencias de otros servicios y/ factorías.

Una factoria se declara de la siguiente manera:

//
    var app = angularjs.module('test',[])

    app.factory('Factoria',function(){

        var data = {
            holaMundo : function(){
                // codigo magico
            }
        }

        return data;
    })
//

La factoria puede ser utilizado en un controlador de la siguiente manera

//
    app.contorller('controllerName',function(Factoria){
        Factoria.holaMundo();
    })
//

A diferencia del servicio lo que AngularJS realiza para retornar el singleton de mi factoría es retornar lo que yo retorno de mi factoría mas no usando el keyword new sobre mi factoría, por esta razón es que tengo un objeto data y ahi es donde tengo/creo toda la funcionalidad.

Hasta este punto la pregunta que sobresale es “Cuando usar un service o cuando usar una factoría?”, bueno mi recomendación es ir a las definiciones de lo que es un servicio y una factoría, una servicio es para exponer una funcionalidad x utilizada en varios lugares de la aplicación mas una factoría es para crear objetos complejos, pero todo esto es una recomendación, cada quien programa como entienda. 😀

Referencia

AngularJS DI
Services

Share on Google+Share on LinkedInShare on RedditShare on TumblrTweet about this on TwitterShare on Facebook
  • Luis Alberto Romero Calderon

    Primero 😀

  • Pingback: Service & Factory Angular | MVVM Javascript...()

  • ottojimb

    Solo una observación pequeña: cuando inicias explicando las factorias dices: “Las factorías en AngularJS son declaradas de forma <> y al igual que los servicio estos” cuando querrás decir: “Las factorías en AngularJS son declaradas de forma <> y al igual que los servicios estos”.

    Por más que he leído sobre factorías y servicios, aún no encuentro una diferencia de peso que me indique si debo optar por una u otra… no se, me falta más adentrarme en angularjs

    • Luis Alberto Romero Calderon

      Gracias por la observación, ambos pueden ser usados para las mismas cosas, pero toman peso cuando estas en un ambiente orientado a objeto, donde tienes tus factorias de objetos y tus servicios con tu logica y eso, pero es un hecho que en angular funcionan para lo mismo, ambas son instancias unicas, una de las diferencias es la forma de retornar/usar el objeto en si pero al final del dia no cambia mucho.

      • ottojimb

        Muchas gracias por estar atento, excelente aclaración!

        • Luis Alberto Romero Calderon

          hehehe No hay de que 🙂

  • Pingback: Service & Factory Angular | javscript | Sc...()