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

    Перевод статьи Доминика Гелино, на тему Инъекции Зависимости (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.

    Это то, что я смог охватить. Я до сих пор не могу сказать, что в полной мере познал инъекции зависимостей, но по крайней мере у меня есть некоторое понимание о том, как это работает. Я надеюсь, вы чувствуете то же самое…
    • +4
    • 33,4k
    • 5
    Поделиться публикацией

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

    Комментарии 5

      0
      Внедрение зависимости создает зависимость (данные) от объекта

      Вот это поворот, я то думал как раз наоборот
        +2
        Статья «ух ты, я прочитал про метатеги в SS, ничего не понял, поэтому надо написать про это на хабре»

        Для этого используется функция flash.utils.describeType которая определена в классе (Class), она возвращает XML представляющий этот класс. В XML содержаться теги, с описанием метатега [Inject]. Именно их SwiftSuspenders ищет в представлении класса при парсинге XML, после этого может свободно сделать инъекцию (заменить метатег на нужное значение) согласно описанным правилам.

        Большие дядьки уже давно используют JSON

        Если Класс использует некоторый набор параметров настроек, которые могут меняться, и его работа зависит от этих параметров, то они должны устанавливаться не в коде Класса, а за его пределами

        Мне кажется Вы в корне не поняли Dependency Injection. Для изменения настроек объекта нет необходимости использовать IoC. IoC нужен, когда Вы хотите писать правильно, используя абстракции, предоставляемые окружением, а не конкретные реализации.

        Теперь Вы конечно можете пойти и создать свои собственные метатеги, но как оказалось, при компиляции компилятор их просто удалит

        … А если вы всё-таки прочитаете документацию, то найдёте там, что метатеги можно включать в SWC, и тогда при компиляции проекта, который использует эту SWC, они не удалятся. Именно так люди создают «свои собственные метатеги»

        Именно их SwiftSuspenders ищет в представлении класса при парсинге XML, после этого может свободно сделать инъекцию (заменить метатег на нужное значение) согласно описанным правилам.

        Заменяется не метатег, а в поле, помеченное этим метатегом, будет установлена ссылка на объект. В этом и смысл МЕТА-тегов, они предоставляют мета-информацию, но главный здесь — это поле.
          0
          IoC = Dependency Injection?
            0
            Inversion of Control — это общий паттерн. Dependency Injection — это частная реализация
          0
          bsideup: Спасибо за комментарий, там где ошибся в переводе, обязательно внесу поправки.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое