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 
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.