Открыть список
Как стать автором
Обновить

Dependency Injection; Хорошо, но как?

Adobe FlashApache Flex
Перевод статьи Доминика Гелино, на тему Инъекции Зависимости (Dependency Injection) и то, как это реализовано во фреймворке Robotlegs. Доминик делает попытку развеять, то ощущение магии, которое появляется у разработчика, когда он использует инъекции в Robotlegs.

Источник: www.zedia.net/2010/dependency-injection-ok-but-how

inject

Еще больше 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.

Это то, что я смог охватить. Я до сих пор не могу сказать, что в полной мере познал инъекции зависимостей, но по крайней мере у меня есть некоторое понимание о том, как это работает. Я надеюсь, вы чувствуете то же самое…
Теги:RobotlegsDependency InjectionSwiftSuspendersFlexAS3
Хабы: Adobe Flash Apache Flex
Всего голосов 8: ↑6 и ↓2 +4
Просмотры33.9K

Похожие публикации

Курс "Apache Spark на Python"
18 мая 202134 000 ₽New Professions Lab
Apache Spark и Scala для дата-инженеров 1.0
14 сентября 202162 000 ₽New Professions Lab
Python для веб-разработки
14 мая 202159 400 ₽SkillFactory
UX/UI дизайнер
14 мая 202183 940 ₽Нетология

Лучшие публикации за сутки