Pull to refresh

Микро-фреймворк Robotlegs. Обзор способов инжекта

Reading time 5 min
Views 6.4K
Введение

Robotlegs является MVC фреймворком для создания приложений на flash/flex. Данный фреймфорк базируется на библиотеке swiftsuspenders, в которой реализуются механизмы инжектирования с помощью метатега [Inject]. В гугле достаточно много материала по использованию данного фреймворка. Поэтому не буду останавливаться непосредственно на инжекте. Однако во всех статьях, которые мне попадались, описывался именно механизм инжекта, но объявлению инжектируемых классов отводилось слишком мало внимания. Именно способам объявления инжектируемых классов я бы и хотел посвятить данную статью.

Объявление модели

Наиболее часто для инжектирования используются классы модели. В фреймворке Robotlegs они наследуются от класса Actor. Объявление инжектируемых классов происходит в методе startup() главного контекста (наследника класса Context). За инжект отвечает свойство injector, методы которого реализуют различные способы инжектирования.
Есть несколько способов зарегистрировать (объявить) классы для последующего инжектирования. Рассмотрим их.
mapClass

mapClass — самый простой способ. В качестве первого параметра указывается запрашиваемый класс (или интерфейс), в качестве второго параметра указывается класс, экземпляр которого будет создаваться при запросе. Третьи аргументом является необязательный идентификатор.
В данном случае при каждом запросе нужного класса будет создаваться новый экземпляр. Конструктор класса не должен принимать аргументов или иметь значения по-умолчанию.
пример:
injector.mapClass(ITestClassActor, TestClassActor, "testClassActor");

Теперь во всех классах, использующих инжектирование, вместо ITestClassActor будет использоваться экземпляр класса TestClassActor. Причем, замечу, что каждый раз это будет новый экземпляр.
mapSingletonOf

mapSingletonOf — работает также как и mapClass, только при запросе экземпляра он создается лишь 1 раз. И каждый последующий запрос возвращает именно этот экземпляр.
injector.mapSingletonOf(ITestSingletonOfActor, TestSingletonOfActor);

mapSingleton

mapSingleton – так же как и mapSingletonOf создает только один экземпляр класса, но в данном случае указывается только инжектируемый класс.
injector.mapSingleton(TestSingletonActor);

Замечу, что приведенные методы сами создают экземпляры необходимых классов, поэтому их конструкторы не должны содержать аргументов. Если необходимо связать класс с уже существующим объектом, нужно использовать метод mapValue.
mapValue

mapValue – служит для связывания класса с конкретным экземпляром.
injector.mapValue(TestValueActor, new TestValueActor());

Однако тут существует небольшая особенность. Как говорилось ранее, при использовании mapClass, mapSingletonOf, mapSingleton экземпляр класса создается автоматически. Причем, при создании, если объект сам использует инжектирование, то все инжекты иницализируются необходимыми экземплярами. При использовании mapValue, мы сами создаем нужный экземпляр, и ижекты не срабатывают. Для того чтобы инжекты сработали, нам нужно воспользоваться методом injectInto, передав в качестве параметра наш экземпляр.
Чтобы было более понятно, рассмотрим небольшой пример:
  1. package test.model 
  2. {
  3.         import org.robotlegs.mvcs.Actor;
  4.         /**
  5.          * класс, от которого мы зависим
  6.          * @author Vadim (-FeLiX-) Seluyanov
  7.          */
  8.         public class TestValueActor extends Actor
  9.         {
  10.                 public function TestValueActor() 
  11.                 {
  12.                         super();
  13.                 }
  14.         }
  15. }
  16.  

  1. package test.model 
  2. {
  3.         import org.robotlegs.mvcs.Actor;
  4.         /**
  5.          * класс, зависящий от TestValueActor
  6.          * @author Vadim (-FeLiX-) Seluyanov
  7.          */
  8.         public class TestInjectIntoActor extends Actor
  9.         {
  10.                 [Inject]
  11.                 public var testValueActor:TestValueActor;
  12.  
  13.                 public function TestInjectIntoActor() 
  14.                 {
  15.                         super();
  16.                 }
  17.         }
  18. }
  19.  
  20.  

в инициализации контекста:
  1. injector.mapValue(TestValueActor, new TestValueActor()); //связываем зависимый класс с конкретным экземпляром (можно любым другим способом)
  2. var injectIntoActor:TestInjectIntoActor = new TestInjectIntoActor(); //создаем экземпляр зависящего класса
  3. injector.mapValue(TestInjectIntoActor, injectIntoActor); //связываем
  4. trace((injector.getInstance(TestInjectIntoActor) as  TestInjectIntoActor).testValueActor); //до инжекта свойство равно null
  5. injector.injectInto(injectIntoActor); //инжектим
  6. trace((injector.getInstance(TestInjectIntoActor) as  TestInjectIntoActor).testValueActor); //после инжекта свойство установлено
  7.  

Мы рассмотрели основные методы объявления инжектируемых экземпляров.
P.S.: Я не рассмотрел еще один метод объявления: использование метода mapRule. Сейчас я разбираюсь с тем, как он работает. Материалов по данному способу нет ни в нашем сегменте интернета, ни в западном. Поэтому ковыряю исходники.
Tags:
Hubs:
+5
Comments 0
Comments Leave a comment

Articles