EJb e Command

Gostaria de saber se ficaria coerente usar Ejb com pattern Command.
Eu teria um único EJB para todos os commands que delegam para a camada de negocio.
ex:

class RegistrarVendaCommand extends Command
{
   public void execute(Map params)
   {
       Venda venda = new Venda();
       venda.registrar(params.get("VALOR"),params.get("DATA"));
   }
}

class EJBChamaTudo
{
   public void executeCommand(String commandName,Map params)
   {
       Command command = (Command) Class.forName(commandName).newInstance(); 
      command.execute(params);
   }
}

class ClienteEJB
{
    EJBChamaTudo ejb = ... instancia.
    // preencha map;
    ejb.executeCommand("RegistraVendaCommand",map);
}

Este código é seguro ?
Eu aproveito as transações e recursos do EJB ?

Bem, a idéia do EJB Command pattern em si não é ruim, mas existem diversas considerações a serem feitas.

Primeiro, caso vá realmente utilizar este modelo mais simples, faça com que o método de seu EJB receba uma instância do Command para não ficar tão limitado. O uso indiscriminado desse padrão pra tudo leva a um código assustadoramente procedural conforme o sistema cresce e por isso é preciso ter cuidado.

Eu recomendo seguir uma abordagem que permita que o uso desse mecanismo seja invisível para quem chama o código, não limitando a classe a ter somente um método “executável” no EJB. O genesis implementa este padrão de forma invisível, algo que talvez você também devesse fazer. Vale a pena dar uma olhada.

Não entendi isso me explique…

[quote=jprogrammer][quote]
não limitando a classe a ter somente um método “executável” no EJB
[/quote]

Não entendi isso me explique…[/quote]

Do jeito que você mesmo postou:

command.execute(params);

somente o método execute, com uma assinatura fixa, pode ser chamado no EJB. Isso é extremamente limitante para uma arquitetura.

É essa a minha dúvida.
Teria apenas um ÚNICO ejb responsavel por toda comunicação client e server.
Mas esse EJB apenas passaria os dados do client para o server e chamaria o command apropriado para a camada de negócios.
Outra coisa, as classes commands não poderiam ser passadas porque elas seriam instanciadas no server e o cliente não necessariamente teria essas classes por motivo de centralizacão.

O EJB poderia ser coberto por uma camada envoltória apenas para não expo-lo.

Essa fina camada involtória se comunica com a camada de apresentação.

o execute poderia retornar valores também

public Object execute(Map params)

Estava pensando nisso apenas como idéia. Por que isso traria idenpencia na comunicação entre client e server.
Qual sua opinião ?

Mantenho os meus comentários iniciais. Dê uma olhada na abordagem do genesis para esta questão, veja o que você acha e, caso ache que não serve pra você, explique o porquê.

Gostei desse genesis. Não vi com detalhes mais parece que ele faz um refactory no código baseado nas anotações. É ± como o XDoclet.

Mas ele dá suporte a aplicações web ?

Hmmm, não é bem isso :slight_smile:

O modelo do genesis que funciona out-of-the-box utiliza anotações e AOP para abstrair a complexidade e arquitetura de deployment da sua aplicação do código de negócios.

Sim e não. Toda a parte relativa a sua pergunta - que é relacionada com a camada de negócios - funcionaria em qualquer ambiente. As APIs de suporte a interface com o usuário são no momento voltadas a aplicações desktop, mas nada impede você de usar WebWork/JSF/Struts/Whatever + genesis.

Na versao 4 o genesis deve prover seu proprio suporte à aplicações web.