Centralizar RemoteObjects Flex [RESOLVIDO]

Existe alguma forma de centralizar a criação de Remote Objects tipo Singleton?
Eu penso em criar um arquivo com todos os objetos remotos de forma que eles possam ser reaproveitados em todo o sistema, porém sendo instanciados uma só vez. Seria mais por organização mesmo, porque estou trabalhando em um sistema que instancia objetos remotos iguais em vários módulos.

Vc pode criar um arquivo ActionScript e colocar as declarações lá, depois é só fazer isso onde vc vai usá-lo:

include "Declaracoes.as";

Bom Dia.

Quando começei a utilizar java com o flex. Criei uma classe para fazer a comunicação usando o RemoteObject.

[code]package {

import mx.controls.Alert;
import mx.rpc.AsyncToken;
import mx.rpc.Responder;
import mx.rpc.events.FaultEvent;
import mx.rpc.remoting.mxml.RemoteObject;

public class JavaRemoto extends RemoteObject {
	private static var singleton:JavaRemoto

	//NOTE: AS3 does not allow for private or protected constructors
	public function JavaRemoto(caller:Function = null){
		super();
		this.showBusyCursor = true;

		if(caller!=JavaRemoto.getInstance())
			throw new Error ("Singleton is a singleton class, use getInstance() instead");
	}
	
	public static function getInstance():JavaRemoto{
		if (singleton == null)
			singleton = new JavaRemoto(arguments.callee);
			
		return singleton;
	}
	
	public function get getConexao():RemoteObject{
		return this;
	}
	
	public function call(Method:AsyncToken, NewResult:Function):void{
		var L_Async:AsyncToken;
		L_Async = Method;
		L_Async.addResponder(new Responder(NewResult, DefaultFaultHandler));
	}

	private function DefaultFaultHandler(Result:FaultEvent):void{	
		Alert.show(Result.fault.faultString,"Error");
	}
}

}[/code]

Adaptei agora para fazer um singleton nela.

Para usar:

private function teste():void{ var remotoJava:JavaRemoto = JavaRemoto.getInstance(); remotoJava.destination = "teste.Teste"; remotoJava.call(remotoJava.getConexao.Hello(), retFunc); }

Muito bom mesmo. Na verdade eu não sabia como fazer um remote object pelo actionScript, fazia sempre pelo mxml. Instanciar essa classe vai melhorar muito a organização do sistema.

EugenioMonteiro.

O que eu gosto de fazer, e é o que agente costuma fazer aqui na DClick é criar um delegate que expoe os métodos do RemoteObject, de modo que quem utiliza a classe ja sabe os metodos, a assinatura de cada metodo, retorno e etc.

Ex.

[code]public UserDelegate
{
public var roUser:RemoteObject;

  public function login(username:String,password:String):void
  {
        // aqui, não temos auxilio do autocomplete, muito menos da assinatura dos métodos etc..
        // mais quem utilizar este delegate, já saberá da existencia deste método que ja foi exposto 
        var asyncToken:AsyncToken = roUser.login(username,password);
        ...
  }

}
[/code]

Agora pra você utilizar esta classe em diversos lugares na sua app, você pode utilizar um container de injeção de dependência.
Por que dai você também, não precisa se preocupar em adquirir uma instância válida do delegate, apenas deixe o container fazer isso pra você.

Dois frameworks que implementam um container para injeção de depêndencia e que vêm chamando a atenção da comunidade são o Mate é o Swiz, vale a pena você dar uma olhada, e ver se resolve seus problemas.

Thiago, e se eu criasse uma classe que herda de RemoteObject e acrescentasse todos os métodos, não daria o mesmo resultado?

Oliveira.caio, porque neste método você precisa passar Method para a variável L_Async? Não pode utilizá-lo diretamente?

        public function call(Method:AsyncToken, NewResult:Function):void{   
            var L_Async:AsyncToken;   
            L_Async = Method;   
            L_Async.addResponder(new Responder(NewResult, DefaultFaultHandler));   
        }  

Pode utilizar direto sim. A ideia do metodo call é não ter que ficar colocando a Function DefaultFaultHandler toda hora.

public function call(Method:AsyncToken, NewResult:Function):void{ Method.addResponder(new Responder(NewResult, DefaultFaultHandler)); }

De uma olhada nisso que o Thiago Felix falou. Usar o delegate vai deixar seu projeto super organizado.
Nunca mexi com injeção de dependencia com o flex. Mais já ouvi falar que o MATE é muito bom.

Vitinho1712,

Essa solução não é adequada pois para cada include que você for dar vai ser um copy paste da classe em cada uma que usou o include. Include no Flex é enganação. A melhor solução na minha opinião é o Swiz.

[]'s

Fiz minha classe da seguinte maneira:

	import mx.controls.Alert;
	import mx.rpc.AsyncToken;
	import mx.rpc.Responder;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.remoting.mxml.RemoteObject;
	

//SINGLETON para Objeto Remoto Atividades
	public class Atividades extends RemoteObject
	{
		private static var singleton:Atividades;
		
		public function Atividades()
		{
			super("amfphp");
			this.showBusyCursor=true;
			this.source="Atividades";
		}
		
		public static function getInstance():Atividades{
			if (singleton==null){
				singleton = new Atividades();
							}
			return singleton;				
			
		}
		
		public function mListarAtividades(codEvento:int, resultado:Function):void{
			var ro:RemoteObject = this;
			ro.listarAtividades.addEventListener(ResultEvent.RESULT, resultado);
			ro.listarAtividades.addEventListener(FaultEvent.FAULT,this.avisoErroPadrao);
			ro.listarAtividades(codEvento);
			
		}
		
		
		private function avisoErroPadrao(resultado: FaultEvent):void{
			
			Alert.show(resultado.message.toString(),"Erro na classe "+this.toString());
			
		}
		
	}

Para utilizá-la:

public var roAtividades:Atividades = Atividades.getInstance();	
roAtividades.mListarAtividades((this.parentApplication as main).ID_EVENTO,listarAtividadesGrid);

EugenioMonteiro.

Você consegue ter o mesmo resultado fazendo herança do RemoteObject, porém utilizando composição é possível que a sua classe delegate utilize remoteObjects diferentes, de acordo com a sua necessidade. Por exemplo, eu posso passar para o delegate um RO que acessa server JAVA, e em outro momento passar para o delegate um RO que acessa server ColdFusion. Não sei se fui claro, idéia é que você consegue utilizar o mesmo delegate para diversos servers sem quebrar o código com quem já o utiliza.

[quote=AUser]Vitinho1712,

Essa solução não é adequada pois para cada include que você for dar vai ser um copy paste da classe em cada uma que usou o include. Include no Flex é enganação. A melhor solução na minha opinião é o Swiz.

[]'s [/quote]

Tô ligado, é que eu tinha entendido outra coisa huahuaha

Só para falar.

Essa sua classe não implementa singleton porque você consegue criar duas instancias da mesma.

public function Atividades() { super("amfphp"); this.showBusyCursor=true; this.source="Atividades"; }

Thiago Felix

Algum livro que fale bem disso tudo que vc comentou?
será que esse:

Ou algum site ??
Alexsandra

Alessandra.

Então, eu já li este livro, ele aborda alguns patterns e mostra como aplica-los utilizando o ActionScript, é interessante pois alguns deles são bem utilizados em aplicações de médio-grande porte, como por exemplo FactoryMethod, Singleton, MVC, etc. Entretando ele não é um livro de Flex, portanto você não vai ler a respeito de RemoteObject nem como organiza-los dentro do seu projeto, etc. Se você quer aprender mais sobre patterns eu recomendo, mais se você quer aprender mais sobre o SKD do flex, estrutura de um projeto Flex, RemoteObject e etc, eu recomendo que você veja o material que a própria Adobe distribui gratuitamente no seu site.

Abraço.