4. ...Простое и понятное API
[Inject]
public var сommandMap : IEventCommandMap;
[Inject]
public var mediatorMap : IMediatorMap;
[Inject(name=”privateInjector”)]
public var injector : IInjector;
…
commandMap.map(CoreEvent.BUY_ITEM).toCommand(BuyItemCommand).withGuards(EnoghMoneyGuard);
commandMap.map(CoreEvent.BUY_ITEM).toCommand(ShowBuyCoinsPopupCommand).withGuards(NotEnoghMoneyGu
ard);
...
injector.map(Model).asSingleton();
injector.map(Model).toSingleton(ConcreteModel);
injector.map(Model).toValue(new Model());
injector.map(IModel).toType(ConcreteModel).seal();
…
mediatorMap.map(IBottomBar).toMediator(BottomBarMediator);
mediatorMap.map(SettingsView).toMediator(SettingsMediator).autoRemove(false);
6. Основные плюсы и возможности:
● модульность
● гибкий и понятный синтаксис
● удобная и простая система внедрения зависимостей
● удобная система расширений
● нет привязки к конкретной реализации сущностей
● унифицирующий стиль разработки
Небольшой минус:
● фреймворк не быстрый
9. Когда доступно:
public class MyInstanceClass {
[Inject]
public var variable:Number;
public function MyInstanceClass() {
// not ready
}
[PostConstruct]
public function initialize():void {
// ready
}
}
17. Bundles
● Набор расширений, описанных в одном файле.
public class MVCSBundle implements IBundle
{
public function extend(context:IContext):void {
context.logLevel = LogLevel.DEBUG;
context.install(
ContextViewExtension,
EventDispatcherExtension,
ModularityExtension,
DirectCommandMapExtension,
EventCommandMapExtension,
LocalEventMapExtension,
ViewManagerExtension,
StageCrawlerExtension,
StageSyncExtension);
context.configure(ContextViewListenerConfig);
}
}
18. Views
● нет конкретной реализации
● рендеринг на основе входящих данных
● предоставляет API
● ничего не знает об устройстве приложения, все данные получает из
медиатора
● может только отправлять события-оповещения для медиатора
● ссылки на вью имеют только другие вью или медиатор
● может иметь несколько медиаторов за раз
19. Mediators
● работает только с одним экземпляром вью за раз
● можно мапить на интерфейс или на несколько классов вью
● создается автоматически при добавлении вью в дисплей лист
● удаляется при удалении вью из дисплей листа (можно отключить)
● служит для связи вью и остальных компонентов приложения
● не имееет никакой постронней логики
● может дергать модели и сервисы напрямую
● может слушать и посылать события отв приложение
20. Commands
● нет привязки к конкретной реализации
● запускаются в ответ на события из общей шины
● предназначены для выполнения какого то одного действия
● создаются, выполняют действие, удаляются
● нельзя получить ссылку на команду
● содержат бизнес логику
● могут дергать модели и сервисы, запускать другие событие
● не могут слушать события приложения
21. Models
● инкапсуляция данных и предоставление API для доступа к ним
● могут диспатчить события в приложение
● не могут слушать события от приложения
● не должны содержать лишней логики
22. Services
● сущности для работы с внешними сервисами
● не хранят данные
● могут парсить данные
● могут диспатчить события в приложение
● не могут слушать события от приложения
23. Guards
● используются для предотвращения создания или выполнения чего либо
● нет привязки к конкретной реализации
● нельзя получить ссылку на гуард
● применяются те же инджекты что и для основной цели
● выполняется непосредственно перед созданием основной цели
● если гаурд не одобряет то основная цель не создается
● мгновенны, асинхронных гуардов пока что нет
● на момент запуска гуарда, все данные должны быть доступны в
24. А теперь все вместе!
делите свой код на более мелкие части по зонам ответственности
25. Что почитать:
● http://knowledge.robotlegs.org/
● https://github.com/robotlegs/robotlegs-framework
● https://github.com/robotlegs/swiftsuspenders
● https://github.com/alebianco/robotlegs-utilities-macrobot
● https://github.com/robotlegs
● ActionScript Developer's Guide to Robotlegs