Сервисы AngularJS: Factory, Service, Provider - создание и расширение

Категория: AngularJS

AngularJS предоставляет такие типы сервисов, как FactoryServiceProvider. Из статьи вы узнаете как инстанцировать и расширять эти сервисы (decoration). Все сервисы (внутренние тоже) AngularJS создает с помощью объекта $provide. Этот же объект позволяет в дальнейшем и расширять все существующие сервисы метод  decorator().  Всю дополнительную информацию вы найдете в официальном руководстве.

Все сервисы - Singleton

Все типы сервисов - FactoryServiceProvider являются синглтонами (Singleton), поэтому любое изменение состояния сервиса будет сохранено во всем приложении.

Примечание

Все типы сервисов поддерживают конфигурацию через метод  config():

APP.config(function(serviceName) {
  serviceName.method('value');
});

* Для доступа сервис-провайдеру следует добавлять к имени префикс (окончание) Provider.

Фабрика (Factory)

Самый простой и часто используемый тип сервиса. Фабрика не накладывает каких-либо ограничений на правила формирования и тип возвращаемых данных. Один из подходов при создании фабрики - это шаблон открытого модуля.

APP.factory('someFactory', function() {
  va privateVariable = 'private variable',
      secondVariable  = true;
  
  function getPrivate() {
    return privateVariable;
  }

  return {
    variable: 'public variable',
    getPrivate: getPrivate
  };
});

Сервис (Service)

Сервис. в отличие от фабрики, вызывает конструктор ф-ции для инстанцирования экземпляра объекта. Конструктор также будет вызван только единожды.

APP.service('someService', function() {
  var privateVariable = 'private variable';
  
  this.publicVariable = 'public value';
  this.getPrivate = function() {
    return privateVariable;
  };
});

Провайдер (Provider)

Провайдер представляет из себя расширенную фабрику. Обычно провайдер используется для описания доступа к ресурсу через JSONP. Провайдер ожидает в возвращаемом объекте функцию $get.

APP.provider('user', function() {
  var privateVariable = 'private variable';

  return {
    setPrivate: function(val) {
      privateVariable = val;
    },
    $get: function() {
      function getPrivate() {
        return privateVariable;
      }

      return {
        publicVariable: 'public value',
        getPrivate: getPrivate
      };
    }
  };
});

// В отличие от прочих сервисов, провайдеру добавляется префикс `Provider`
APP.config(function(userProvider) {
  fooProvider.setPrivate('New value from config');
});

Примеры сервис-провайдеров: $routeProvider, $locationProvider, ...

Декорация сервисов

Для расширения методов сервисов в AngularJS имеется сервис $provide, и его метод decorator(). В callback ф-цию этого метода передается оригинальный экземпляр сервиса ($delegate), который мы и расширяем.

APP.config(function($provide) {
  $provide.decorator('someService', function($delegate) {
    $delegate.extendMethod = function() {
      return 'расширяем сервис someService методом extendMethod';
    };

    return $delegate;
  });
});

категория: AngularJS