Перевод статьи Доминика Гелино, на тему Инъекции Зависимости (Dependency Injection) и то, как это реализовано во фреймворке Robotlegs. Доминик делает попытку развеять, то ощущение магии, которое появляется у разработчика, когда он использует инъекции в Robotlegs.
Источник: www.zedia.net/2010/dependency-injection-ok-but-how/
Еще больше Robotlegs для Вас парни, но на сей раз в более концептуально.
Одна мысль которая досаждала мне в Robotlegs — это само выражение Dependency Injection. Клевое слово, это должно означать что-то значительное. Да это так, если вы просто взглянули на него; не углубляясь. Если вы найдете время подумать об этом, то поймете, что все немного иначе.
Половина всего, что мы делаем — это Инъекция
Хорошо, то как Вы реализуете внедрение зависимости, фактически довольно просто и это то, что Вы делаете каждый день (конечно, если Вы программируете). Внедрение зависимости создает зависимость (данные) от объекта, через конструктор, метод или свойство. Джоэл Хукс писал в статье на InsideRIA ( прочтите, хорошая вводная статья ): «Когда вы передаете переменную в конструктор класса, вы используете инъекцию зависимости. Когда вы устанавливаете значение свойства в классе, вы используете инъекцию зависимости…
Разве это не приятно; я могу просто идти по офису и всем говорить, что делаю инъекции зависимости.
Концепция, в чем суть
Сначала я читал об этом в лучших практиках Robotlegs и я ничего не мог понять ( это в основном потому, что я впервые столкнулся с этим шаблоном проектирования, и конечно не имею претензий к этому документу). После того я нашел статью Хукса и я сказал себе: „это не так сложно, чего я так суетился“, но, у меня не было настоящего понимания концепции (почему) которая стоит за всем этим. Для того чтобы разобраться я прочитал эту статью. Пример на самом деле очень просто и ясно проясняет почему следует использовать инъекции зависимости.
То, почему нам нужно использовать инъекции зависимости важно главным образном для создания более гибких Классов. Если Класс использует некоторый набор параметров настроек, которые могут меняться, и его работа зависит от этих параметров, то они должны устанавливаться не в коде Класса, а за его пределами. Таким образом каждый раз при изменении параметров настроек, Вы не должны лезть в код Класса, чтобы изменить их. Вам действительно нужно прочитать статью Фабьена Потантье об этом; он объясняет лучшее чем я. Также довольно хороша презентация сделанная Джеффом Мором. Чем больше Вы читаете, тем больше Вы будете понимать, как это работает.
Прекрасно, но это все еще похоже на волшебство Robotlegs
Когда Вы читаете статью Википедии про инъекции зависимости, в одном месте они приводят список некоторых недостатков и один из них был таким — “Код использующий инъекции зависимости может казаться магией для некоторых разработчиков”, и это точно, то что я чувствовал в контексте Robotlegs. Главным образом из-за использования метатега [Inject]. Это не тот механизм, к который я привык использовать в AS3. Я думал, что Метатеги, это такие святые благословенные ключевые слова, которые может создать только Adobe.
Оказывается я был не прав, ну хорошо, на половину не прав. Метатег [Inject] используется во время выполнения, в то время как скажем метатег [Embed] используется во время компиляции, таким образом, это не тот же самый зверь.В Robotlegs инъекции обрабатывает SwiftSuspenders. Что это означает, то что для всех правил которые вы создаете используя методы mapValue, mapClass и mapSingleton, он просматривает какие классы должны быть возвращены. Для этого используется функция flash.utils.describeType которая определена в классе (Class), она возвращает XML представляющий этот класс. В XML содержаться теги, с описанием метатега [Inject]. Именно их SwiftSuspenders ищет в представлении класса при парсинге XML, после этого может свободно сделать инъекцию (заменить метатег на нужное значение) согласно описанным правилам.
Теперь Вы конечно можете пойти и создать свои собственные метатеги, но как оказалось, при компиляции компилятор их просто удалит. Если вместо SWC вы используете исходники для SwiftSuspenders, то Вам нужно добавить к параметрам компилятора:
-keep-as3-metadata+=Inject
-keep-as3-metadata+=PostConstruct //Это - другой метатег, который использует SwiftSuspenders
Это будет препятствовать удалению метатегов из классов компилятором, таким образом, изменив эти строки, вы заставите компилятор сохранить созданные ранее Вами метатеги. Я понятия не имею, почему не нужно этого делать при использовании SWC.
Это то, что я смог охватить. Я до сих пор не могу сказать, что в полной мере познал инъекции зависимостей, но по крайней мере у меня есть некоторое понимание о том, как это работает. Я надеюсь, вы чувствуете то же самое…
Автор: iliacmd