Não não, AOP não deve ser usado como regra de negócio, concordo plenamente contigo, acho que não fui claro, vou tentar explicar melhor:
Tenho um repository que tem DAO que é a sua respectiva “ponte” ao banco. Esse repository tem um DAO que é injetado. Ah, e esse repository está em person
Agora imagina assim, na tua classe Person, existe um método que é transacional, por exemplo
@Transactional
public void doCrazyStuff( Foo foo ) {
// a lot of code
}
Agora vamos imaginar que foi criado um “aspecto de benchmark/profilling”
@Around
public Object calculateTime( ProceedingJoinPoint pjp ) throws Exception {
// nome de método PROVAVELMENTE está errado heiuaohaheai
Long millis = System.getCurrentMillis();
Object o = pjp.invoke();
log.info( "Method called in " + (System.getCurrentMillis() - millis) + "ms" );
return o;
}
O que esse código e o @Transactional tem em comum? Ambos precisam ser criados pelo application context. Em outras palavras, se eu carregar um objeto de um HQL/Lazy Loading com aquele @Transactional do Spring, aquele método não irá ser transacional. E, além disso, os pointcuts da classe de domínio rica não irão funcionar também (porque na real o Spring cria um proxy para o AOP funcionar)
O que se perde é isso, quando não usamos o container de IoC do Spring: As dependencias e essas features. Se eu colocasse uma camada de serviço, daí isso poderia ser corrigido (ou um façade, whatever). Mas sem essas camadas, haveria outra solução?
[quote=Leozin]Não não, AOP não deve ser usado como regra de negócio, concordo plenamente contigo, acho que não fui claro, vou tentar explicar melhor:
[/quote]
Não é nem que nào dve, dá pra fazer coisas bem interessantes com AOP e regras de negócio, só não acho que combine muito com DDD. Na verdade é a primeira vez que penso sobre isso.
Eu não pesquisei e não brinco de Spring há algum tempo mas você já viu um artigo na developerWorks sobre Spring AOP + Transações do hibernate? Eu achei hoje de manhã (17:57 aqui agora :P) e não conseui mais encontrar.
[quote=pcalcado][quote=Leozin]Não não, AOP não deve ser usado como regra de negócio, concordo plenamente contigo, acho que não fui claro, vou tentar explicar melhor:
[/quote]
Não é nem que nào dve, dá pra fazer coisas bem interessantes com AOP e regras de negócio, só não acho que combine muito com DDD. Na verdade é a primeira vez que penso sobre isso.
Eu não pesquisei e não brinco de Spring há algum tempo mas você já viu um artigo na developerWorks sobre Spring AOP + Transações do hibernate? Eu achei hoje de manhã (17:57 aqui agora :P) e não conseui mais encontrar.[/quote]
Assim, na minha opinião, é quase nula a possibilidade de juntar AOP para regra de negócio. Eu acho que AOP é mais usado para profiling, segurança, logging, o que eles chamam de “crosscutting concerns”. Agora com regra de negócio, (independente de ser rich ou anemic model), não sei onde se encaixaria.
Acho que achei algo aqui sobre o problema anterior. Vou fazer uns testes (também quero ver esse hinjector que o Rafael postou)
Houve uma discussão interessante na lista de domaindrivendesign sobre a utilização de AOP para regras de negócios e DDD.
Mais detalhes em http://www.infoq.com/news/2008/02/ddd-di-aop