| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/09/2007 10:30:18
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 650
Offline
|
Muito tem se falado no grupo sobre DDD, Repository, Domain Model, etc.
Contudo estou tendo muita dificuldade para tornar estes conceitos práticos, utilizando JavaEE.
Por exemplo:
Quem orquestra os objetos de domínio é uma ServiceLayer, no meu caso um Stateful ou Stateless do Seam.
Meu DomainModel é constituído de Entitys(Objetos com identidade) com lógicas de negócio além obviamente de seus atributos no meu caso ele é uma classe JPA anotada com @Entity.
Na maioria das vezes as lógicas neles contidas precisam de um acesso a banco, então eles levam um (ou varios) repository consigo... como atributo da classe ou dentro do próprio método.
Então começam alguns problemas. Meu Entity deveria receber injeção deste repository... porém como o Entity é carregado por JPA, eu não consigo injetar nenhum objeto nem por @In do Seam nem mesmo por Spring.
Uma solução seria fazer com que a ServiceLayer enviasse por "set" um repository para o Entity. Mas o código do Service iria ficar poluido, tendo um repository que ele nem faz uso, só instancia para o entity. Toda vez que fosse utilizar uma lógica de negócio do entity que utiliza acesso a banco, teria que minha outra camada setar o repository pra ele.
Qual seria uma outra solução que poderia ser adotada? Mesmo com o advento do JavaEE 5 com tantos frameworks de D.I. vou ter que utilizar ServiceLocator para localizar Repository nos entitys?
[]´s
This message was edited 1 time. Last update was at 27/09/2007 10:33:34
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.org/
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/09/2007 19:27:36
|
Ednelson
HelloWorld
![[Avatar]](/images/avatar/01f8343e378b1ae8d0b66c992e7f7563.jpg)
Membro desde: 22/04/2007 16:57:39
Mensagens: 15
Offline
|
... porém como o Entity é carregado por JPA, eu não consigo injetar nenhum objeto nem por @In do Seam nem mesmo por Spring.
Com Spring 2.0 vc pode injetar dependências em objetos criados fora do conteiner, vc tem até mesmo duas opções, por AOP ou por chamada explicita do BeanFactory, Urubatan corrija-me se estiver errado
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/09/2007 20:14:40
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 650
Offline
|
Isso é mesmo possível? Impressionante!
Bom, acabei descobrindo tbm que consigo acessar qualquer componente do Seam através de Componente.getInstance("nomeDoComponente"). Mesmo abstraindo este acesso nos objetos de entidade, não me parece uma coisa muito elegante, contudo ao que parece utilizando o Seam não tenho outra saida.
Ou Tenho?
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.org/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/09/2007 20:52:00
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
Membro desde: 07/08/2002 18:38:50
Mensagens: 3877
Localização: São Paulo
Offline
|
No Hibernate (mesmo usando JPA) voce pode adicionar um Interceptor que toda vez que um bean sai do entity manager/session, o setXXXRepository é invocado.
|
http://blog.caelum.com.br
QCon SP: o maior evento de líderes e arquitetos agora no Brasil |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2007 08:40:50
|
Ferryman
JavaGuru
![[Avatar]](/images/avatar/2e3907cbad887e6a1bea84d450b756db.jpg)
Membro desde: 26/10/2006 16:30:23
Mensagens: 208
Offline
|
Paulo,
Mas esses interceptors fazem parte da spec de JPA? Porque se não fizer, qual o sentido de utilizar JPA se o sistema só irá funcionar com a implementação do hibernate?
[]s
Ferry
|
Jsigner - Engenharia reversa automática através do maven. Acesse http://code.google.com/p/jsigner |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2007 08:39:13
|
Fabio Kung
JavaEvangelist
Membro desde: 08/03/2004 08:24:47
Mensagens: 445
Localização: São Paulo
Offline
|
Me falta tempo, mas eu tô tentando resolver justamente esses problemas no: http://sourceforge.net/projects/hinjector/
|
Procurando por oportunidades de emprego?
OndeTrabalhar.com
OndeTrabalhar.com Java?
http://blog.caelum.com.br
Fabio Kung
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/10/2007 08:58:25
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 650
Offline
|
Bom, fiz algo que ficou bem interessante:
- Um Aspecto que intercepta a instanciação de todas as classes do meu pacote com classes de entidades, injetando neste momento as dependências que forem necessárias. O legal é que fica completamente transparente para o desenvolvedor.
Com isso tanto faz se a instanciação for através de "new", "jpa" ou qualquer outro framework, a injeção vai funcionar do mesmo jeito.
Veja o código usando AspectJ:
Na entidade, basta anotar:
O Código do Aspecto pode ser melhorado, como incluir suporte para injecao pelo método "set", mas esse foi apenas um esboço de como pode ser feito.
[]'s
This message was edited 3 times. Last update was at 06/10/2007 09:15:14
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.org/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/10/2007 10:11:29
|
andre_salvati
Virtual Machine Man
Membro desde: 02/06/2005 16:28:38
Mensagens: 784
Offline
|
Lezinho wrote:
Na maioria das vezes as lógicas neles contidas precisam de um acesso a banco, então eles levam um (ou varios) repository consigo... como atributo da classe ou dentro do próprio método.
Hmmm... lógica de acesso a banco nos Entitys... estranho isso...
This message was edited 2 times. Last update was at 06/10/2007 10:12:07
|
"Don't be evil"
http://suaempresadigital.wordpress.com
http://www.google.com/profiles/andre.f.salvati
http://twitter.com/afsalvati
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/10/2007 10:33:41
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 650
Offline
|
Lógica de acesso a banco? Onde?
A entidade tem acesso ao "repositório", que de nada tem haver com "Lógica de acesso ao banco". O repositório tem "intimidade" com a lógica de negócio, faz parte dela, nada mais justo que estar no modelo de domínio.
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.org/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/10/2007 10:53:43
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 650
Offline
|
Mas concordo que fui infeliz na minha afirmação do primeiro post " precisam de um acesso a banco", o q queria dizer foi:
"precisam de um acesso ao repositório".
This message was edited 2 times. Last update was at 06/10/2007 10:55:43
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.org/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/10/2007 11:49:11
|
andre_salvati
Virtual Machine Man
Membro desde: 02/06/2005 16:28:38
Mensagens: 784
Offline
|
Lezinho wrote:Mas concordo que fui infeliz na minha afirmação do primeiro post " precisam de um acesso a banco", o q queria dizer foi:
"precisam de um acesso ao repositório".
Continua estranho, Entitys dependendo de Repositories....
|
"Don't be evil"
http://suaempresadigital.wordpress.com
http://www.google.com/profiles/andre.f.salvati
http://twitter.com/afsalvati
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/10/2007 12:17:14
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 650
Offline
|
A dependencia é injetada, entao nao vejo problema. O fato de ser um repository dentro de um entity tbm não encontro nada de errado, ambos fazem parte da lógica de negócio.... mais uma vez.... REPOSITÓRIO É NEGÓCIO..
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.org/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/10/2007 12:30:56
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5170
Localização: Sydney - Australia
Offline
|
Lezinho wrote:A dependencia é injetada, entao nao vejo problema. O fato de ser um repository dentro de um entity tbm não encontro nada de errado, ambos fazem parte da lógica de negócio.... mais uma vez.... REPOSITÓRIO É NEGÓCIO..
Correto. A falta de entendimento das pessoas sobre Repositories x DAOs causa este tipo de confusão mas basta ler a bibliografia para entender que um Repositório é parte do domínio e por isso não há qualquer problemas em relacionar entidades à ele.
This message was edited 1 time. Last update was at 06/10/2007 14:27:37
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/10/2007 12:49:17
|
andre_salvati
Virtual Machine Man
Membro desde: 02/06/2005 16:28:38
Mensagens: 784
Offline
|
Lezinho wrote:A dependencia é injetada, entao nao vejo problema. O fato de ser um repository dentro de um entity tbm não encontro nada de errado, ambos fazem parte da lógica de negócio.... mais uma vez.... REPOSITÓRIO É NEGÓCIO..
A questão é a forma como ela é injetada (lembre-se do princípio do KIS).
Os Repositories - e os DAOs dos quais eles dependem, já que vc prefere assim - dependem do Service e não dos Entitys.
Dê um olhada no caveatemptor (aplicação de referência para uso de Hibernate).
|
"Don't be evil"
http://suaempresadigital.wordpress.com
http://www.google.com/profiles/andre.f.salvati
http://twitter.com/afsalvati
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/10/2007 12:59:55
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 650
Offline
|
Taz, vc pde injetar por "set" sendo enviado pelo Service, como mostrei no primeiro post, gerando o problema que tbm já mostrei.
O que fiz, via annotation, faz a injeção pelo SEAM (por debaixo dos panos do aspecto), não a nada de errado nisso... a dependencia foi invertida.
Você não esta sendo claro, ou não esta entendendo.
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.org/
|
|
|
 |
|
|