DDD: Mais uma dúvida sobre (Repositório na Entity) x Serviço

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 :frowning: (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

Abraços.