Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.09.2015, 15:03
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 1  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
По умолчанию [Robotlegs] Не инжектится Service в Command

Здравствуйте, почему-то не заинжектился сервис в команду
Версия Robotlegs 2
Вот конфиг
Код AS3:
...
[Inject]
public var injector:IInjector;
 
public function configure():void
		{
			injector.map(FloxService);
 
			commandMap.map(ConfigEvent.CONFIG_INIT_COMPLETE).toCommand(ShowIntroScreenCommand);
 
			commandMap.map(ScreenEvent.TO_MAIN_SCREEN_REQUEST).toCommand(ShowMainScreenCommand);
			commandMap.map(ScreenEvent.TO_INTRO_SCREEN_REQUEST).toCommand(ShowIntroScreenCommand);
			commandMap.map(ScreenEvent.SAVE_DATA_REQUEST).toCommand(SaveDataCommand);
 
			mediatorMap.map(IntroScreen).toMediator(IntroScreenMediator);
			mediatorMap.map(MainScreen).toMediator(MainScreenMediator);
 
			context.afterInitializing(initComplete);
		}
 
		private function initComplete():void
		{
			dispatcher.dispatchEvent(new ConfigEvent(ConfigEvent.CONFIG_INIT_COMPLETE));
		}
...
Команда
Код AS3:
public class SaveDataCommand extends Command{
 
    [Inject]
    public var service:IService;
 
    public function SaveDataCommand() {
        trace("service = "+service);
        if(service){
            service.saveData();
        }
        else{
            trace("Service is NULL");
        }
 
    }
}
}
Сервис
Код AS3:
package dev.div0.services
{
import com.gamua.flox.Flox;
 
public class FloxService implements IService {
 
	public function saveGoToMainCount(count:int):void {
		Flox.logEvent("go_main_clicked", {count: count});
	}
 
	public function saveGoToIntroClick():void {
		Flox.logEvent("go_intro_clicked");
	}
 
	public function saveData():void {
		Flox.getTime(getTimeCompleteHandler, getTimeErrorHandler);
	}
 
	private function getTimeErrorHandler(error:String, httpStatus:int):void {
			trace("saveData error:"+error +".  httpStatus:"+httpStatus);
		}
 
		private function getTimeCompleteHandler(time:Date):void {
			new SaveData(time.toString());
		}
	}
}
Вот текст ошибки
Код:
Error: Injector is missing a mapping to handle injection into property "service" of object "[object SaveDataCommand]" with type "dev.div0.commands::SaveDataCommand". Target dependency: "dev.div0.services::IService|"
Эта ошибка возникает если я инжектю сервис в команду в виде интерфейса

Если же инжектю в команду реализацию сервиса
Код AS3:
[Inject]
    public var service:FloxService;
то в результате
Код:
 Service is NULL
Подскажите, пожалуйста, где я ошибся

Добавлено через 1 час 14 минут
Вопрос снят. Моя невнимательность.
В команде не переопределил метод execute(), в котором следует обращаться к сервису. Вместо этого в конструкторе пытаюсь это сделать


Последний раз редактировалось djyamato; 20.09.2015 в 16:18.
Старый 20.09.2015, 21:51
alexandrratush вне форума Посмотреть профиль Отправить личное сообщение для alexandrratush Найти все сообщения от alexandrratush
  № 2  
Ответить с цитированием
alexandrratush
 
Аватар для alexandrratush

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 529
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
Добавлю пару строчек.
Может вы уже и сами догадались, что Robotlegs сначала создает объект, и только потом инжектирует все зависимости. Будь то Комманда, Медиатор или любой другой класс, который создается на уровне ядра фреймворка. Существует метатег PostConstruct, которым помечают публичный метод. Этот метод вызывается автоматически, как только буду разрешены все зависимости.

Старый 21.09.2015, 09:57
ShockWave512 вне форума Посмотреть профиль Отправить личное сообщение для ShockWave512 Посетить домашнюю страницу ShockWave512 Найти все сообщения от ShockWave512
  № 3  
Ответить с цитированием
ShockWave512

Регистрация: Dec 2007
Адрес: NA
Сообщений: 741
Отправить сообщение для ShockWave512 с помощью Skype™
В RL2, инжектится тип после конструктора класса.

Для команды надо оверрайдить метод execute().

Код AS3:
public class SaveDataCommand extends Command {
 
[Inject]
public var service:IService;
 
public function SaveDataCommand() {
}
 
override public function execute():void {
	 trace("service = "+service);
        if(service){
            service.saveData();
        }
        else{
            trace("Service is NULL");
        }		
}
}

Старый 07.10.2015, 15:46
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 4  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
djyamato, в первом случае вам надо было зарегистрировать сервис по интерфейсу.
Код AS3:
injector.map(IService).toSingleton(FloxService);
__________________
משיח לא בא
משיח גם לא מטלפן

Создать новую тему Ответ Часовой пояс GMT +4, время: 03:59.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 03:59.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.