Подтвердить что ты не робот

Что такое тип дружественной инъекции?

В документации AngularJS, есть объяснение различий между factory, сервисом, значением, константой и провайдера.

В конце у нас есть таблица сравнения: Comparison table Один из рядов - "дружественная инъекция". Я не мог понять, что это такое.

Что это значит? Кроме того, что означает, что для того, чтобы значение имело эту "дружественную инъекцию типа", стоит ценой "нетерпеливой инициализации с использованием нового оператора напрямую"?

4b9b3361

Ответ 1

В AngularJS вы можете вводить зависимости несколькими способами:

  • в директиве link по позиции
  • в определении директивы по имени
  • в функции контроллера по имени
  • в функции factory по имени
  • в сервисной функции по типу

Тип дружественной инъекции позволяет вам implicity вызывать функцию конструктора по ссылке:

myApp.service('Pattern', ["Infinity", RegExp]);

а не путем экспликации с использованием ключевого слова new:

myApp.factory('Pattern', 
 ["Infinity", function(Infinity) 
  {
  return new RegExp(Infinity);
  } 
 ]);

ИЛИ

function goInfinity(Infinity)
  {
  return new RegExp(Infinity);
  } 

goInfinity.$inject = ["Infinity"];
myApp.factory('Pattern', goInfinity);

Рецепт службы создает службу, аналогичную рецептам Value или factory, но делает это, вызывая конструктор с новым оператором. Конструктор может принимать ноль или более аргументов, представляющих зависимости, необходимые экземпляру этого типа.

Ожидаемая инициализация означает, что рецепт constant должен возвращать конструктор для использования вышеупомянутого синтаксиса:

function RegExpConstant() 
  {
  return new RegExp(Infinity);
  } 

myApp.constant('Pattern', RegExpConstant)

вместо того, чтобы возвращать значение функции, объекта или буква.

Номенклатура происходит от Java:

Служба - это хорошо известный набор интерфейсов. Поставщик услуг - это конкретная реализация службы. A factory - это объект, который возвращает ссылку на объект на другой объект

Ссылки

Ответ 2

Моя интерпретация "дружественной инъекции типа":

Заводы и поставщики внедряют все, что возвращается функцией factory, и функция $get соответственно, которая может быть любого типа и потенциально может динамически меняться во время выполнения. Принимая во внимание, что инъекции Service, Constant и Value имеют фиксированный тип, о котором известно Angular, поскольку он хорошо определен во время определения рецепта. Следовательно, это дружественные инъекции типа.

Ответ 3

Тип здесь относится к:

  • примитивы,
  • литералы объектов,
  • или
  • даже экземпляр пользовательского типа

Фабрики и поставщики наиболее гибки из Сервиса, константы, ценности в терминах того, что они связывают с инжектором. Следовательно, Angular может обнаружить тип объекта/примитива, привязанный к Service, Constant, Value, следовательно, более дружественный, поскольку мы знаем тип upfront (время разработки/сборки).

Ответ 4

Я просто задал себе тот же вопрос, глядя на ту же самую таблицу.: -)

Моя лучшая интерпретация значений в этой строке таблицы заключается в том, что она фактически означает "можно ли узнать, что создало экземпляр службы из самого экземпляра службы", то есть "установлено ли свойство экземпляра службы constructor значимая функция".

Здесь более подробная интерпретация для каждого из рецептов:

  • factory: нет, но может быть да, если вы построите возвращаемое значение, вызвав оператор new
  • служба: да - будет ссылаться на функцию рецепта службы
  • значение/ константа: да, но только если вы построите значение, вызвав оператор new
  • поставщик: нет, но может быть да, если вы построите возвращаемое значение метода provider.$get, вызвав внутри оператора new)

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