cliente.pagar(faturaEmAtrazo);Cliente é uma entidade do sistema, com isso não quero dizer que o cliente deve ter a lógica de pagamento de faturas, mais é ele quem inicia o processo, de onde então vem a lógica? De uma service:
public class ControleDeFaturas {
public void receberPagamento(Cliente cliente,Fatura fatura){
.... // aqui residiria a lógica de
}
}
e o cliente como fica? Ele recebe por Dependency Injection o serviço de controle de faturas, usando o framework seam teriamos algo como:@Entity
public class Cliente {
@In
private ControleDeFaturas controleDeFaturas;
...
public void pagar(Fatura fatura){
controleDeFaturas.receberPagamento(this,fatura);
}
}
Assim o modelo fica melhor, agora um problema que temos no SEAM é que ele não faz injeção de dependências nas entitys, para resolver este problema temos várias soluções, poderíamos usar a entity com uma factory que receberia o controleDeFaturas, ou mesmo fazer lookup da dependência usando Component.getInstance("controleDeFaturas"), uma abordagem que usei a qual estou gostando é o uso de Aspectos, aspecto resolve este problema, de uma forma transparente, onde mesmo se instanciarmos o Cliente por meio de um new Cliente(); ainda teríamos a injeção da dependência.você pode visualizar a classe aqui que resolveu meu problema (usa aspectj).
Com certeza a classe pode ser melhorada, mas inicialmente resolveu o problema e permitiu uma habilitação de um domínio rico usando o SEAM, basicamente ele injeta uma instancia sempre que encontra uma classe com a anotação @Entity e um @In tanto faz ser nos atributos da classe, ou nos métodos acessores.
Devo agradecer ao Alessandro Lazarotti que sugeriu o aspecto acima como solução no fórum do guj.