Концептуальное: внедрение зависимостей сеттера для Angular 1.*

предисловие — это скорее концептуальное обсуждение, чем "практическое руководство". Если есть простой способ реализации, то я, безусловно, был бы благодарен за советы о том, как это сделать, но я действительно хочу получить представление о том, почему/почему это невозможно или это хорошая идея. Приветствуются любые комментарии/конструктивная критика.

внедрение зависимостей на основе свойства/установщика

новые API-интерфейсы $injector

# pseudo-code

postInjectionHook = 'init'

injectInto = (target)->
    for key of target
       if $injector/this.$has key
           target[key] = $injector.get key

    if target[postInjectionHook] is Function
        target[postInjectionHook]()

пример простого контроллера

angular.module 'app', []
.controller, 'SomeController', class SomeController

  $http: undefined
  $q: undefined

  init: -> #do some work after we get our dependencies

в другом месте в угловой земле

uiController = new SomeController
$injector.injectInto uiController

Почему?

Мне нравится простота JavaScript. Это очень гибкий, но мощный язык. Однако я не думаю, что я единственный разработчик, пришедший из другого языка программирования и жаждущий определенных функций, отсутствующих в javascript. Таким образом, я использую наследование (я знаю, Боже мой!!!) для структурирования многих базовых классов при разработке моих приложений. В частности, все мои угловые контроллеры наследуются от ключевых базовых классов (например, baseViewController, basePopupController и т. д.).

Форсирование Angular на основе конструктора DI делает наследование несколько болезненным, если я планирую выйти за рамки базовых классов контроллера. Аргументы конструктора должны быть перенесены во все подклассы. Хотелось бы, чтобы был способ разрешить различные типы внедрения зависимостей.


comment
Я лично не вижу в этом необходимости. Я обнаружил, что могу сделать чертовски много, просто повторно используя контроллеры, а затем используя композицию, чтобы добавить любую пользовательскую функциональность, которая мне нужна (с помощью директив или добавления небольших подконтроллеров с помощью ng-controller). Состав по наследству FTW!   -  person Amy Blankenship    schedule 02.11.2015
comment
Внедрение зависимостей на основе сеттера — это эвфемизм для создания непригодных для использования экземпляров. Сказав, что используя фабрику, вы можете вводить зависимости так, как хотите.   -  person a better oliver    schedule 02.11.2015
comment
@zeroflagL Я, конечно, сам это читал и понимаю, почему некоторые так утверждают. Однако обратный вызов postInjectionHook для цели внедрения будет защитой от отсутствующих зависимостей. Что касается вашего заводского комментария, можете ли вы привести простой пример? Буду ли я использовать module.factory вместо module.controller?   -  person jusopi    schedule 02.11.2015
comment
Я подумал, что комментария pseudo-code будет достаточно. Добавлен тег coffeescript.   -  person jusopi    schedule 02.11.2015
comment
Вы, безусловно, полагаетесь на реализацию класса кофе для наследования, и это создает контекст. Я не уверен, чем он отличается от ES7/TS, но наследование зависимостей это не проблема. Я не уверен, что модифицированный $injector может решить какие-либо проблемы, которые нельзя решить иначе, но он определенно может их создать: тестирование, удаление унаследованных зависимостей и т. д.   -  person Estus Flask    schedule 02.11.2015
comment
В соответствии с вашим кодом postInjectionHook будет вызываться после того, как мы получим наши зависимости, поэтому это не может быть защитой. С другой стороны, это JavaScript, и вы можете вызвать конструктор без аргументов и, таким образом, также создать непригодный для использования экземпляр;) В любом случае, реализация вашего подхода не должна составлять особых усилий. Думаю, достаточно доработать invoke(), который, кстати, можно считать заводским. Однако вам придется как-то пометить свои классы, чтобы другой код, основанный на внедрении конструктора (например, весь Angular), не переставал работать.   -  person a better oliver    schedule 02.11.2015