Pergunta

Estamos trabalhando em um cliente rico (escrito em Flex), que está ligado a um backend Java, usando tanto RMI e JMS. Eu estava pensando em implementar o cliente de uma forma DDD para que ele tenha repositórios para as operações CRUD sobre os objetos de domínio.

O problema é, porém, que toda a comunicação backend acontece assíncrona e não há maneira de me forçar o cliente para esperando para continuar até que ele recebeu uma resposta. Isso significa que, em um nível baixo, eu posso chamar um método em um objeto remoto e eu recebo um AsyncToken como um valor de retorno. Posso, então, ouvir eventos no asynctoken para ver se a chamada passou ou falhou. Este, porém, rompe a ideia principal por trás de um repositório, para esconder os detalhes técnicos do cliente.

Pode haver 2 opções eu acho:

  1. têm os métodos no retorno repositório asynctoken, o que parece ser uma solução confuso para me
  2. têm os métodos retornam uma coleção vazia (para uma findAll por exemplo) que vai ficar cheia quando a resposta é recebida.

Ambos têm prós e contras e gostaria de obter algumas informações de vocês.

(tendo isso ainda mais, o que seria bom estratégias de cache? Dependind sobre a situação, eu não quero o repositório para chamar o servidor cada vez que eu solicitar todas as entidades a partir dele. Como isso afetaria a assinatura dos métodos de o repositório.)

Foi útil?

Solução

Flex e Flash Remoting é inerentemente assíncrona de modo a lutar contra esse paradigma está indo dar-lhe uma tonelada de problemas. Nossos delegados serviço de retorno AsyncToken de cada método e nunca tivemos um problema com ele.

Se você quiser garantir que o aplicativo não torna uma nova visão ou executar alguma outra lógica até que o resultado / falha volta, você pode fazer o seguinte:

  1. Coloque um ouvinte de evento para um evento personalizado que irá chamar o seu "resultado post / código de falha"
  2. Faça a chamada assíncrona
  3. Lidar com o resultado / falha
  4. despachar o evento personalizado para acionar o seu ouvinte a partir nº 1

Tenha em mente que isto vai levar a um monte de código boilterplate irritante toda vez que fizer uma chamada assíncrona. Gostaria de considerar com muito cuidado se você realmente precisa de um caminho de execução síncrona.

Outras dicas

Eu recomendaria retornando um AsyncToken como retornando uma coleção vazia só se sente mal.

No caso em que você está retornando dados de um cache, retornar um CompletedAsyncToken (: AsyncToken). Que aciona automaticamente o evento COMPLETE com os dados sempre que o evento COMPLETE está inscrito (e depois removido o manipulador)

public class CompleteAsyncToken : AsyncToken
{
    public function CompleteAsyncToken(data : Object)
    {
        super(data);
    }

    public override addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false) : void
    {
        super.addEventListener(type, listener, useCapture, priority, useWeakReference);

        if (type == Event.COMPLETE)
        {
            // Don't just execute listener as EventDispatcher is not that simple
            super.dispatchCompleteEvent();
            super.removeEventListener(type, listener);
        }
    }

Um straegy seria a criação de uma fachada em frente ao repositório. Seu cliente vai fazer chamadas Asychronous para a fachada que por sua vez faz uma chamada síncrona para seu repositório. Isso permitirá que o seu repositório de continuar a trabalhar de forma síncrona, enquanto a fachada gere os aspectos assíncronos de sua chamada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top