Что такое "декораторы" и как они используются?

Мне интересно, какие именно декораторы есть в AngularJS. В Интернете не так много информации для декораторов, за исключением рекламы в документации AngularJS и краткого (хотя и интересного) упоминания в видео на YouTube.

Как говорят ребята из Angular, декоратор это:

Оформление сервиса, позволяет декоратору перехватить создание экземпляра сервиса. Возвращаемый экземпляр может быть исходным экземпляром или новым экземпляром, который делегирует исходному экземпляру.

Я действительно не знаю, что это значит, и я не уверен, почему вы должны отделить эту логику от самого сервиса. Например, если бы я хотел вернуть что-то другое в других условиях, я бы просто передавал различные аргументы соответствующим функциям или использовал другую функцию, разделяющую это частное состояние.

Я все еще в некотором роде AngularJS, так что я уверен, что это просто невежество и / или вредные привычки, которые я подхватил.

5 ответов

Решение

Хороший вариант использования $provide.decorator это когда вам нужно сделать небольшую "подстройку" к какой-либо сторонней / восходящей службе, от которой зависит ваш модуль, при этом оставив службу без изменений (поскольку вы не являетесь владельцем / сопровождающим службы). Вот демонстрация на планкр.

Декораторы позволяют нам выделять сквозные проблемы и позволяют сервисам сохранять принцип единой ответственности, не беспокоясь о "инфраструктурном" коде.

Практическое использование декораторов:

  • Кэширование: если у нас есть сервис, который выполняет потенциально дорогие HTTP-вызовы, мы можем обернуть сервис в декоратор кэширования, который проверяет локальное хранилище перед выполнением внешнего вызова.
  • Отладка / Трассировка: есть переключатель в зависимости от конфигурации разработки / производства, который украшает ваши сервисы обертками отладки или трассировки.
  • Регулирование: оборачивать часто вызываемые вызовы в обертку для устранения помех. Позволяет нам легко взаимодействовать, например, с ограниченными тарифами.

Во всех этих случаях мы ограничиваем код в сервисе до его основной ответственности.

decorator может перехватить экземпляр службы, созданный factory, service, value, providerи дает возможность изменить некоторые instance(service) в противном случае это не настраивается / с параметрами.

Он также может предоставить макеты для тестирования, например $http,

Проще говоря, мы можем сказать, что это как метод расширения. Например У нас есть класс, и у него есть два метода, и во время выполнения мы хотим добавить в него больше методов, чем используем Decorator.

Мы не можем использовать $provide.decorator с константами, потому что мы не можем изменить константы, для которых они имеют свойство только для чтения.

Вкратце декораторы можно описать следующим образом:

Функция декоратора перехватывает создание сервиса, позволяя ему переопределить или изменить поведение сервиса.

Он использует $provide обслуживание по угловым и изменить или заменить реализацию другого сервиса

$provide.decorator('service to decorate',['$delegate', function($delegate) {
  // $delegate - The original service instance, 
  //             which can be replaced, monkey patched, 
  //             configured, decorated or delegated to. 
  //             ie here what is there in the 'service to decorate'

  //   This function will be invoked, 
  //   when the service needs to be provided 
  //   and should return the decorated service instance.
  return $delegate;
}]);

Пример:

$provide.decorator('$log', ['$delegate', function($delegate) {
  // This will change implementation of log.war to log.error
  $delegate.warn = $delegate.error; 
  return $delegate;
}]);

Приложения

В дополнение к ответу @JBland.

  • Широкие языковые настройки приложения:-

    Вы можете найти пример здесь

  • Изменение поведения по умолчанию и существующей реализации сервиса с помощью углового сервиса:-

    Вы можете найти образец здесь

  • Переключение поведения функции в разных средах.

Другие вопросы по тегам