Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   RemoteObject (http://www.flasher.ru/forum/showthread.php?t=130324)

Night_rainbow 23.09.2009 16:57

RemoteObject
 
Подскажите, пожалуйста, best practice по использованию RemoteObject

К примеру, у меня есть некоторый бин, с которым я буду связываться посредством RemoteObject. У этого бина куча методов, к примеру.
Каждый раз создавать RemoteObject в каждой mxml как-то громоздким кажется.
Нельзя ли вынести этот RemoteObject в отдельный mxml, прописать все существующие методы и не создавать этот объект каждый раз, а обращаться к статическим методам, например, созданным в объекте, который наследует RemoteObject

То есть
Код AS3:

...
MyRemoteObject extend RemoteObject{
...
 
public static function getSmth():ArrayCollection{
  return getSmth()//из <mx:method name="getSmth"..../>
}
}

Что-то в этом роде... или как правильно, подскажите, пожалуйста?

Alex_41 23.09.2009 18:00

Мб не "best practice", но я вижу так (на работоспособность после копи-паста не проверял):

Код AS3:

package service
{
  import mx.controls.Alert;
 
        import mx.messaging.ChannelSet;
        import mx.messaging.channels.AMFChannel;
 
        import mx.rpc.events.FaultEvent;
        import mx.rpc.events.ResultEvent;
        import mx.rpc.remoting.RemoteObject;
 
        public class MyService extends RemoteObject
        {
                private        var amfChannel: AMFChannel;
 
                public function MyService(){
                        initRemoteObject();
                }
 
                private function initRemoteObject():void{
                        channelSet = new ChannelSet();
                        amfChannel = new AMFChannel("Your destination", "Your uri");                       
                        channelSet.addChannel(amfChannel);
 
                        destination = "Your destination";
                        source = "Your source";
 
                        getOperation("MethodName").addEventListener(ResultEvent.RESULT, rhMethodName);
                        getOperation("MethodName").addEventListener(FaultEvent.FAULT, faultHandler);
                }
 
                public function callMethodName():void{
                    getOperation("MethodName").send();               
                }
 
                private function rhMethodName(event: ResultEvent):void{
                    // your code here       
                }
 
                private function faultHandler(fault: FaultEvent):void{
                    // your code here
                    Alert.show("Method name: " + fault.currentTarget.name + "\n \n" + fault.message.toString(), "Fault Message");
                }
        }
}

Код AS3:

package service
{
        public class MyServiceSingleton
        {
                private static var ms: MyService;
 
                public static function getInstance():MyService{
                        if(ms == null){
                                ms = new MyService();
                        }
                        return ms;
                }
        }
}

Код AS3:

var myService: MyService = MyServiceSingleton.getInstance();
myService.callMethodName();


Night_rainbow 23.09.2009 18:06

Да, спасибо большое. Я это уже смотрел.. хотелось сделать вот такого рода штуку:

Код AS3:

package remote {
import mx.rpc.AbstractOperation;
import mx.rpc.remoting.mxml.RemoteObject;
 
public class MyRemoteObject extends RemoteObject{
    private static var instance:MyRemoteObject = new MyRemoteObject();
 
    public function MyRemoteObject() {
        super();
        destination = "flexuserDaoService";
        endpoint = "http://ausatov:8080/flexapp/springwraper/messagebroker/amf";
 
    }
 
    public static function getAllFlexUsers(func:Function):void {
        instance.addEventListener("result", func);
        var op:AbstractOperation = instance["getAllFlexUsers"];
        op.send();
 
    }
 
}
 
}

Нормально ли выглядит? Понятное дело, что доработать нужно - чтобы и параметры кидать методу...
И надо слушателя удалять после того, как получили ответ....

wvxvw 23.09.2009 18:12

>> Подскажите, пожалуйста, best practice по использованию RemoteObject
Не использовать его :) Использовать NetConnection, у него и API вменяемые, и работать будет соответственно быстрее, да и вообще... если вы не используете MXML готовые решения, то смысла расширять фреймворковские классы нет. Фреймворк хорош когда нужно быстро из полуфабрикатов пожрать приготовить, но если вы уже решили по-настоящему готовить, то смысл покупать лапшу быстрого приготовления отсутствует :)

Night_rainbow 23.09.2009 18:19

Спасибо. А где можно почитать о том, как его использовать вместо RemoteObject?

wvxvw 23.09.2009 18:26

http://livedocs.adobe.com/flex/3/lan...onnection.html
Ну собственно, вот...
Т.е. как вы сами понимаете, RemoteObject - это какя-то надцатая оболчка вокруг оболочки оболочки NetConnection.

Night_rainbow 23.09.2009 18:53

Большое спасибо за указание верного пути! :)

Код AS3:

public class MyNetConnection extends NetConnection{
    public function MyNetConnection() {
        super();
        var res:Responder = new Responder(onResult,onFault);
 
        connect("http://localhost:8080/flexapp/springwraper/messagebroker/amf");
        call("flexuserDaoService.getAllFlexUsers",res);
    }
 
 
protected function onResult(result:Object):void{
  trace("");
}
 
    protected function onFault(result:Object):void{
        trace("");
}
}
}

Вот так отлично работает! Осталось все это красиво оформить только...

Добавлено через 33 минуты
Хочу уточнить... Подскажите, пожалуйста. Метод connect() по спецификации:
Цитата:

Creates a bidirectional connection between a Flash Player or AIR application and a Flash Media Server application
Меня интересует вопрос, нужно ли его закрывать?
К примеру, есть приложение. К примеру, за все время жизни приложения оно будет использовать NetConnection объект, вызывая метод getAllFlexUsers:

Код AS3:

public class MyNetConnection extends NetConnection{
    private static var instance:MyNetConnection = new MyNetConnection();
    public function MyNetConnection() {
        super();
        var res:Responder = new Responder(onResult,onFault);
 
        connect("http://ausatov:8080/flexapp/springwraper/messagebroker/amf");
 
    }
 
    public function getAllFlexUsers(responder:Responder):void{
        instance.call("flexuserDaoService.getAllFlexUsers",responder);
    }
 
protected function onResult(result:Object):void{
  trace("");
}
 
    protected function onFault(result:Object):void{
        trace("");
}
}
}

Это нормально - постоянно держать соединение открытым? К примеру, таких объектов-синглтонов может быть очень много. У каждого будут свои вызовы... Хорошо ли это? Просто не хочется все методы пихать в один класс, хочется разделить на отдельные *.as файлы


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

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