предисловие — это скорее концептуальное обсуждение, чем "практическое руководство". Если есть простой способ реализации, то я, безусловно, был бы благодарен за советы о том, как это сделать, но я действительно хочу получить представление о том, почему/почему это невозможно или это хорошая идея. Приветствуются любые комментарии/конструктивная критика.
внедрение зависимостей на основе свойства/установщика
новые 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 делает наследование несколько болезненным, если я планирую выйти за рамки базовых классов контроллера. Аргументы конструктора должны быть перенесены во все подклассы. Хотелось бы, чтобы был способ разрешить различные типы внедрения зависимостей.
postInjectionHook
для цели внедрения будет защитой от отсутствующих зависимостей. Что касается вашего заводского комментария, можете ли вы привести простой пример? Буду ли я использоватьmodule.factory
вместоmodule.controller
? - person jusopi   schedule 02.11.2015pseudo-code
будет достаточно. Добавлен тег coffeescript. - person jusopi   schedule 02.11.2015postInjectionHook
будет вызываться после того, как мы получим наши зависимости, поэтому это не может быть защитой. С другой стороны, это JavaScript, и вы можете вызвать конструктор без аргументов и, таким образом, также создать непригодный для использования экземпляр;) В любом случае, реализация вашего подхода не должна составлять особых усилий. Думаю, достаточно доработатьinvoke()
, который, кстати, можно считать заводским. Однако вам придется как-то пометить свои классы, чтобы другой код, основанный на внедрении конструктора (например, весь Angular), не переставал работать. - person a better oliver   schedule 02.11.2015