| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/03/2010 13:55:11
|
Lavieri
GUJ Master
![[Avatar]](/images/avatar/7b41bfa5085806dfa24b8c9de0ce567f.png)
Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline
|
mario.fts wrote:Lavieri
poderia explicar melhor esta estrutura:
pelo que eu entendi queries é uma classe onde vc pode pegar objetos de consulta especificos de cada classe do mdoelo, no caso o forPessoa retorna um desses objetos pra classe Pessoa. nesses objetos estão as queries especificas de pessoas, como no exemplo listPessoasAtivas. só não entendi o que esse query on retorna, acho que é um obejto que sabe qual query a ser executada no repositório, mas não estou com certeza disso.
Achei muito bacana, quero entender pra montar algo do tipo.
[]'s
queries e' uma fachada.... ele conhece os caminhso para os objetos que conhece a query de cada entidade...
PessoaQuery contem todas as querys para pessoas
QueryableList e' uma interface
HiberanteQuery<T> e' uma classe que retorna Queryable<T> ou QueryableList<T>
a implementacao desses metados e' juntar a session do Repository com a DatechedCriteria que e' passado no construtor.
e assim retorna a consulta tipada que esta definida no queryable ou queryablelist
This message was edited 1 time. Last update was at 17/03/2010 13:56:38
|
Sun Certified Java Programmer (SCJP 6)
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999
Meu blog -> http://blog.tomazlavieri.com.br/ |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/03/2010 14:10:57
|
mario.fts
GUJ Ranger
![[Avatar]](/images/avatar/9e96d422fba85185a33829439f5df09d.jpg)
Membro desde: 14/05/2008 09:41:06
Mensagens: 809
Localização: São Paulo - ZL
Offline
|
Muito bom cara, vou montar um esquema assim pra testar.
Valeu.
|
Mário Amaral Gonçalves
"Ciência da computação tem tanto a ver com o computador como a Astronomia com o telescópio, a Biologia com o microscópio, ou a Química com os tubos de ensaio. A Ciência não estuda ferramentas, mas o que fazemos e o que descobrimos com elas." - Edsger Dijkstra |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/03/2010 15:14:52
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3420
Offline
|
rogelgarcia wrote:Com a nova (nem tão nova assim) onda de se utilizar JPA ao invés de Hibernate, surgem as questões...
Quase todo mundo que hoje utiliza JPA, tem como implementação o Hibernate que já utilizavam anteriormente..
O JPA introduziu novas interfaces e classes além do que já tinhamos que saber com o Hibernate. Mas o JPA não é uma especificação completa porque ainda é necessário em alguns momentos utilizar coisas especificas do Hibernate.
O JPA acabou introduzindo uma nova camada de persistencia e nós sabemos que camadas em cima de camadas trazem problemas.
Se a implementação de JPA que todo mundo utiliza é o Hibernate, qual é a utilidade de se ter JPA?
Nenhuma. A utilidade do JPA é nenhuma.
Depois que o pessoal do Core Patterns JEE levou na cabeça , e depois que o Hibernate foi criado foi desenvolvido o padrão DomainStore.
É este padrão que o JPA tenta implementar.
O JPA nasceu como uma alternativa OO ao JDBC mas ao contrario deste ele nasceu falho. O conceito de Native Query é completamente idiota
porque mata o objetivo de ter um mecanismo portável entre bancos. Da mesma forma que o JDBC precisa de um mecanismo para o adquar a vários bancos o JPA precisa do mesmo. O Hibernate não precisa.
O sucesso do hibernate se deve ao padrão DomainStore e ao fato de ser free. Hoje em dias temos opções como Eclipse Link, mas aprender a usar mais uma ferramenta ORM é chato p'rá caramba.
Usar o JPA é na realidade um erro no contexto geral e só justificavel se vc quiser aderir às normas de portabilidade JEE, que todo o mundo já sabe são falhas em si mesmas.
É um falso argumento que precisamos do JPA para isolar o hibernate. Isso é feito facilmente com objetos criados por nós mesmos usando padrões como bridge e strategy. Eu nunca usaria JPA por escolha.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/03/2010 15:19:59
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3420
Offline
|
Lavieri wrote:eu iniciei lendo no blog do sergio taborda http://sergiotaborda.wordpress.com/desenvolvimento-de-software/java/patterns/repository/
depois fui fazendo a minha maneira....
A entender, a diferenca basica do DAO pro RESPOSITORIO, e' que o DAO acumla as queries dentro dele, e por isso vc sai criando 1 DAO por Entidade.... isso traz dificuldade, pois uma Session funciona com um repositorio, ela funciona igual seja a entidade qual for.........
Entao o repositorio tem aceita objetos em seus metodos, e asism repository.add(Object o); e assim para cada operacao,
Tudo que for generico vc deixa no repositorio, ou seja
<T> List<T> repo.list(Class<T> target);
<T> T repo.get(Class<T> target, Object id);
repo.refresh(Object object);
etc etc etc
e as queries as consultas, vc separa coloca em outro objeto, eu crirei uma interface pra fazer isso...
e no fim, eu executo uma Query em um Repository,
que para o hiberante eu so faco pegar um DatechedCriteria que esta dentro do queries, e unir a session dentro do repository, e assim a magica da consulta acontece...
Incrível, mas eu quiz dizer exatamente o contrário do que vc entendeu.
O Repositório não é genérico nem agnóstico, ele é concreto e associado a uma única entidade. O repositório cria as queries, ele não executa as queries.
Cada repositorio especifico contém métodos para encontrar aquele tipo de entidade, conforme critérios que fazem sentido para ela. Pode conter métodos gerais comuns a todas as entidades como save e delete, mas fortemente tipados para aceitar apenas aquele tipo de entidade. nisto os repositorios em nada são diferentes dos antigos DAO.
A diferença entre DAO e Repositório é que o DAO é um tradutor de tecnologias (ORM, OXM, etc...) Repositório é um encapsulador de regras de pesquisas e um ponto centrar para procurar objetos daquela entidade.
vou ter que mehlorar esse artigo ....
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/03/2010 15:26:39
|
rogelgarcia
GUJ Master
![[Avatar]](/images/avatar/861e8bae74e22a572164fdb59b1caa8b.jpg)
Membro desde: 21/06/2007 23:27:21
Mensagens: 1838
Offline
|
Alessandro Lazarotti wrote:Tem vários motivos para vc iniciar um projeto com JPA, a maioria já foi explanado aqui, mas vamos lá:
- Bootstrap facilitado: HibernateUtil é um "workaround" necessário para se construir a SessionFactory. Já vi muita implementação meia boca estourando memória por causa disso. O JPA em ambiente JavaEE é bem mais eficiente em sua inicialização com o apoio do persistence.xml, autodiscovery das classes anotadas e gerencia do EntityManager feita automaticamente pelo container (abri, fechar, descarregar e injetar).
- D.I. - Uma vez fazendo parte da especificação, ele se beneficia de todos os demais recursos enterprises, sobre injeção de dependencia e todo seu ciclo de vida. No JavaEE 6, isso esta ainda melhor, uma vez que não apenas EJBs podem se beneficiarem com isso, mas qualquer bean.
- Portabilidade (menos relevante) - nao considero isso a melhor feature para iniciar um projeto com JPA, pq EU utilizao muita coisa do Hibernate. Mas para quem preza por independecia de implementação pode ser um atrativo.
O fato é, 99,9% das vezes inicio os projetos com JPA. Quando algo nao me atende entao getDelegate para obter a session do hibernate, sem pestanejar. Mas nao perco a integração com o ambiente JavaEE e nem seu bootstrap que é uma mao na roda.
Pois então.. tudo isso que voce falou aí .. chegou atrasado.. já existem essas features a 5 anos no framework que eu criei
Pros projetos que eu uso então.. nao teria vantagem.. a nao ser a questao de portabilidade que é o menos importante..
E se eu quiser usar o JPA no desktop.. é trivial?
This message was edited 2 times. Last update was at 17/03/2010 15:30:35
|
Rógel Garcia, criador do framework NEXT
http://www.nextframework.org
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/03/2010 15:27:54
|
rogelgarcia
GUJ Master
![[Avatar]](/images/avatar/861e8bae74e22a572164fdb59b1caa8b.jpg)
Membro desde: 21/06/2007 23:27:21
Mensagens: 1838
Offline
|
Alessandro Lazarotti wrote:
rogelgarcia wrote:Eu poderia estar com um Mestre desatachado da sessao.. que eu quisesse persistir... (mas a lista de Detalhe está vazia)
Eu gostaria de só alterar o Mestre.. mas se eu pedir pra salvar o Mestre desse jeito.. o hibernate também deleta o detalhe...
Mas "PQ" detalhe esta vazia???
Se Mestre esta detachado e vc faz "Merge", ele nao apaga sua lista, ele relinka os proxies de Detalhe, que NAO esta vazio.
A não ser que vc tenha construído o Mestre com "new", o que nao deveria ser feito.
A parte controller da minha app.. pode ter criado o Mestre.. entao será com new por exemplo
|
Rógel Garcia, criador do framework NEXT
http://www.nextframework.org
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/03/2010 15:58:52
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3420
Offline
|
Lavieri wrote:j
Isto que vc desenhou não é um repositorio é um DAO. Repositorios são usados assim
O codigo não sabe qual é o critério que define que a pessoa é ativa. Nem sabe como procurar essa especie de pessoas
Dentro do Repositorio vc tem isto
Repare que o query é em cima da persistanceStategy. Que pode ser um DAO ou domainStore
O importante aqui é que a criação do critério de busca é no proprio repositório. É essa a sua principal função : encapsular a criação dos critérios.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/03/2010 18:40:03
|
Lavieri
GUJ Master
![[Avatar]](/images/avatar/7b41bfa5085806dfa24b8c9de0ce567f.png)
Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline
|
sergiotaborda wrote:...
O codigo não sabe qual é o critério que define que a pessoa é ativa. Nem sabe como procurar essa especie de pessoas
Dentro do Repositorio vc tem isto
Repare que o query é em cima da persistanceStategy. Que pode ser um DAO ou domainStore
O importante aqui é que a criação do critério de busca é no proprio repositório. É essa a sua principal função : encapsular a criação dos critérios.
Bom o nome pode não ser esse... masss o que eu não gosto do DAO é justamente o fato de ser tipado, e de ter as queries dentro dele, ter que usar 192382938 lugares para adicionar e remover entidades é o ponto onde não gosto.... e pra mim isso é dar um passo pra traz.
O Hiberante aceita qualquer objeto em suas sessions, e vc encapsular a session e restringir isso pra mim é tiro no pé.
.........
O meu repositorio, é realmente o que diz o nome, é um lugar onde se guarda onde se armazena as entidades, é possivel adicionar, remover, atualizar buscar entidades dentro dele.
........
O queries faz parte da camada de persistencia, e vem justamente para não ter q existir 10928239289 repositorios e existir apenas 1, o único objetivo é desassociar as consultas do repositorio e assim não ter q existir vários locais, ou seja, varios repositorios.
queries.forPessoa().listPessoasAtivas().queryOn(repository);
é apenas pq é muito mais legal 1 repositorio, um único lugar
do que ter
repoPessoa.listPessoasAtivas();
repoCarro.listCarrosByAno(2005);
repoEtc.procureEtcPorCriterioX(x);
enfim isso é xato, é extremamente chato!
repository.forPessoas().listPessoasAtivas(); poderia ate ser... mais ai eu tenho que juntar ao repository, e meu repositorio independe de projeto.
enfim, o conceito que vc viu pode ate ser de ser tudo junto, mas desassociar me da mais flexibilidade, e não tenho intenção de abrir mão disso ^^
|
Sun Certified Java Programmer (SCJP 6)
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999
Meu blog -> http://blog.tomazlavieri.com.br/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/03/2010 19:19:40
|
Lavieri
GUJ Master
![[Avatar]](/images/avatar/7b41bfa5085806dfa24b8c9de0ce567f.png)
Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline
|
mario.fts wrote:Muito bom cara, vou montar um esquema assim pra testar.
Valeu.
ahhh
eu também tenho objetos Executables, que é uma interface e tem apenas o método para executar
serve para algo como
This message was edited 2 times. Last update was at 17/03/2010 19:21:35
|
Sun Certified Java Programmer (SCJP 6)
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999
Meu blog -> http://blog.tomazlavieri.com.br/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/03/2010 00:24:26
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 718
Offline
|
rogelgarcia wrote:
Alessandro Lazarotti wrote:
rogelgarcia wrote:Eu poderia estar com um Mestre desatachado da sessao.. que eu quisesse persistir... (mas a lista de Detalhe está vazia)
Eu gostaria de só alterar o Mestre.. mas se eu pedir pra salvar o Mestre desse jeito.. o hibernate também deleta o detalhe...
Mas "PQ" detalhe esta vazia???
Se Mestre esta detachado e vc faz "Merge", ele nao apaga sua lista, ele relinka os proxies de Detalhe, que NAO esta vazio.
A não ser que vc tenha construído o Mestre com "new", o que nao deveria ser feito.
A parte controller da minha app.. pode ter criado o Mestre.. entao será com new por exemplo
Será como não, SERA de fato um new. Se o seu controller criou o Mestre, e não buscou do banco, então é um novo Mestre, o detalhe obivamente é vazio e faz sentido que seja - o estado do objeto é transiente. Se você quer ter uma referência ao banco sem ter problema de reescrita em um campo que vc nao esta utilizando, utilize "getReference" em vez de "find". Ele passa seu objeto ao estado persistent, sem carregar nada, nem mesmo ir ao banco, apenas adiciona proxies. Como vc quer apenas setar uma propriedade, essa seria a escolha correta (sem entrar no mérito do batch update).
This message was edited 2 times. Last update was at 18/03/2010 00:58:41
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.org/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/03/2010 00:38:28
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 718
Offline
|
rogelgarcia wrote:
Pois então.. tudo isso que voce falou aí .. chegou atrasado.. já existem essas features a 5 anos no framework que eu criei
Pros projetos que eu uso então.. nao teria vantagem.. a nao ser a questao de portabilidade que é o menos importante..
E se eu quiser usar o JPA no desktop.. é trivial?
Então seu framework chegou atrasado, estas features já existiam a muito mais tempo na integração do Spring com HIbernate, por exemplo. Mas sua pergunta não foi essa, e sim - "Qual a importancia de se utilizar JPA ao invés de Hibernate?" - não somado a utilização de outros framework.
Utilizar JPA em Desktop tem os mesmos problemas de utilizar Hibernate em Desktop. Com a vantagem de você poder utilizar o Persistence.createEntityManagerFactory("blablabla") em vez de implementar o HibernateUtil.
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.org/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/03/2010 00:54:56
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 718
Offline
|
Embora discorde dos pontos que vc colocou, Taborda, como justificativa a NUNCA usar JPA, eu respeito. Faço isso por conhecer e ter trabalhado com pessoas que tem a mesma visão que a sua. Na minha opinião é uma decisão de arquitetura, tem gente que gosta, tem gente que não.
Mas gostaria realmente de enteder alguns destes pontos que vc colocou. Por exemplo:
sergiotaborda wrote:O JPA nasceu como uma alternativa OO ao JDBC mas ao contrario deste ele nasceu falho. O conceito de Native Query é completamente idiota
porque mata o objetivo de ter um mecanismo portável entre bancos. Da mesma forma que o JDBC precisa de um mecanismo para o adquar a vários bancos o JPA precisa do mesmo. O Hibernate não precisa.
Pq nasceu falho e o que isso tem haver com nativeQuery? Na verdade o próprio Hibernate tbm tem suporte a queries nativas através de session.createSQLQuery, exatamente da mesma forma que entityManager.nativeQuery. Assim como no hibernate, utiliza querys nativas quem quer por própria conta e risco, ou pode usar JPQL ou Criteria com a APi da especificação, como vc usa HQL com o HIbernate Core.
This message was edited 1 time. Last update was at 18/03/2010 00:57:52
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.org/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/03/2010 07:52:55
|
Alexandro.Almeida
JavaBaby
![[Avatar]](/images/avatar/185d74f7b374c0ac461ca88fdb8c8b4a.jpg)
Membro desde: 25/07/2008 09:00:19
Mensagens: 97
Localização: Itu
Offline
|
Lavieri wrote:
mario.fts wrote:Lavieri
poderia explicar melhor esta estrutura:
pelo que eu entendi queries é uma classe onde vc pode pegar objetos de consulta especificos de cada classe do mdoelo, no caso o forPessoa retorna um desses objetos pra classe Pessoa. nesses objetos estão as queries especificas de pessoas, como no exemplo listPessoasAtivas. só não entendi o que esse query on retorna, acho que é um obejto que sabe qual query a ser executada no repositório, mas não estou com certeza disso.
Achei muito bacana, quero entender pra montar algo do tipo.
[]'s
queries e' uma fachada.... ele conhece os caminhso para os objetos que conhece a query de cada entidade...
PessoaQuery contem todas as querys para pessoas
QueryableList e' uma interface
HiberanteQuery<T> e' uma classe que retorna Queryable<T> ou QueryableList<T>
a implementacao desses metados e' juntar a session do Repository com a DatechedCriteria que e' passado no construtor.
e assim retorna a consulta tipada que esta definida no queryable ou queryablelist
Quanta complicação. Qual o objetivo disto tudo?
Crie um Repository (Interface sobre uma DAO ou como uma classe Concreta) e seja feliz!
|
--
Alexandro D. Almeida
Meu antigo perfl perdido http://www.guj.com.br/user/profile/15752.java |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/03/2010 09:07:46
|
Lavieri
GUJ Master
![[Avatar]](/images/avatar/7b41bfa5085806dfa24b8c9de0ce567f.png)
Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline
|
Alexandro.Almeida wrote:
Quanta complicação.  Qual o objetivo disto tudo?
Crie um Repository (Interface sobre uma DAO ou como uma classe Concreta) e seja feliz!
eu sou feliz, vc nao ?
o objetivo e' tornar o codigo claro, legivel, e separar a camada de persistencia do restante do projeto.
nao pense que fico la escrevendo o queries o tempo todo, e que la tem consultas q eu nao preciso por exemplo...
o processo e' simples
queries.forPessoas().listPessoasAtivas()
nesse ponto eu aperto CTRL + 1 ... no eclipse, ele cria o metodo na classe, eu escrevo o DetachedCriteria rapidinho e pronto, volto pra logica
depois sempre que precisa fica la no mesmo canto a consulta....
............
eu trabalho em varios projetos ao mesmo tempo, todos com o mesmo pacote basico, e com a mesma estrutura .... trabalhar em um com centanas de dao, pode ser bom, mas quando trabalhe com varios e' so ter 2 objetos para camada de persistencia (o Repositorio e o Queries) e' simplismente otimo
|
Sun Certified Java Programmer (SCJP 6)
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999
Meu blog -> http://blog.tomazlavieri.com.br/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/03/2010 10:23:35
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3420
Offline
|
Lavieri wrote:
Bom o nome pode não ser esse... masss o que eu não gosto do DAO é justamente o fato de ser tipado, e de ter as queries dentro dele, ter que usar 192382938 lugares para adicionar e remover entidades é o ponto onde não gosto.... e pra mim isso é dar um passo pra traz.
O Hiberante aceita qualquer objeto em suas sessions, e vc encapsular a session e restringir isso pra mim é tiro no pé.
.........
O meu repositorio, é realmente o que diz o nome, é um lugar onde se guarda onde se armazena as entidades, é possivel adicionar, remover, atualizar buscar entidades dentro dele.
........
um lugar onde se guardam e retornam objetos de qualquer tipo é um DomainStore. É por isso que vc consegue criar uma implementação baseada no Hibernate porque ele tb é um DomainStore. Vc está simplesmente desacoplando o conceito da implementação. Mas ao trocar o nome do conceito vc está fazendo um mal a si mesmo.
O repositório é um objeto que cria criterios e os envia ao DomainStore para serem executados.
No seu caso, vc tem uma classe com métodos estáticos que lhe dão a query que precisa e executa em cima do domainStore ( o que vc chama de reposiotorio é na realidade um DomainStore).
A sua arquitetura não tem Repositorios.
Vc não tem 10928239289 repositorios mas tem 10928239289 métodos estáticos numa classe. Qual vc acha que é melhor prática ?
Um consulta rápida na internet lhe mostrará que coisas estáticas são evil. A principal razão é que não são testáveis (porque não são "mokáveis").
Aposto que vc não tem testes para essa classe.
O queries faz parte da camada de persistencia, e vem justamente para não ter q existir 10928239289 repositorios e existir apenas 1, o único objetivo é desassociar as consultas do repositorio e assim não ter q existir vários locais, ou seja, varios repositorios.
Errado. Primeiro as queries fazem parte da camada de dominio. É um erro comum achar que fazem parte da persistencia, mas não fazem. Elas mudam conforme as regras do dominio e conforme a organização do dominio, logo são da camada de dominio.
Segundo, tudo bem que desassocie as consultas do local onde os objetos estão (DomainStore) , mas o problema aqui é a criação e controle dessas queries, não as queries em si, nem o DomainStore. E é ai que entra o padrão Repository
Não é uma questão de ser legal ou não. É uma questão de ser flexivel, desacoplado, de facil manutenção e testável.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
|
|