Separando ações de leitura e edição entre Repository e Services

 Seria interessante separar as ações de leitura e ediçao deixando por exemplo,as pesquisas nos Repositorios

e as alterações nos serviços?
Se o repositorio é o local onde os objetos estão, não seria correto o repositorio ter somente métodos de pesquisa, podendo encapsular uma session ou um entityManager para realizar as pesquisas e deixar os métodos de alteração nos serviços ou isso é um overkill?

Obrigado

[quote=danielbussade] Seria interessante separar as ações de leitura e ediçao deixando por exemplo,as pesquisas nos Repositorios
e as alterações nos serviços?
Se o repositorio é o local onde os objetos estão, não seria correto o repositorio ter somente métodos de pesquisa, podendo encapsular uma session ou um entityManager para realizar as pesquisas e deixar os métodos de alteração nos serviços ou isso é um overkill?

Obrigado
[/quote]

Vc tem razão. Os repositorios só têm métodos de pesquisa e os serviços “atualizam” a informação.
O problema é que se os dados estão nos repositorios e os serviços os alteram , como eles fazem isso sem usar os reqposiotiros ?
A resposta é : Eles utilizam um terceiro objecto X que os repositorios consultam.
A necessidade de X é logica a menos que vc queira espalhar codigo de acesso ao banco pelos repositorios e serviços.

Esse X é então o verdadeiro local onde os estados estão. Isso forma um triangulo repositorio-X-serviço

O padrão Repository tal como originalmente definido pelo Fowler não tem métodos de edição. Apenas de alteração.
Mas na arquitetura do Fowler existem outros objetos como os DAO e os DataMappers e companhia que seriam aquele X que falei.

Numa arquitetura mais fechada o objecto X pode ser ignorado se o repositorio for editável.
A logica é : se o repositório é onde ficam os dados é necessário colocá-los lá primeiro.

O serviço então comunica com apenas com o repositório para operações de pesquisa e edição.
E o repositório comunica com X. O triângulo é quebrado, temos agora 3 camadas.

X pode ser um DAO ou um DomainStore ou um Webservice ou um LDAP ou qq coisa. Não importa muito porque sendo uma camada posso encapsulá-lo atrás de um façade.

Olá Sérgio obrigado pela resposta, mas ainda me resta algumas dúvidas, você diz que o repositório não tem metodos de edição apenas de alteração, não seriam a mesma coisa??

Outra dúvida quem seria o responsável por colocar e tirar os objetos no repositório ? Ou seja onde estariam os metodos de Create, e Delete?

Digamos em uma aplicação WEB , o mais correto seria assim?

//Operacao de leitura
Http -> Servlet -> Action >Repository>DAO> SGDB e traz a informação necessária

//Operacao de inserção
Http -> Servlet -> Action >“O que entraria aqui”>DAO> SGDB

E uma ultima duvida eh correto criar as instancia do domino, de dentro da action, ex:

Em um form com nome e login o usuario envia a requisição e na action eu faço isso:

Usuario usuario=new Usuario(request.getParameter(nome),request.getParameter(login));
ou
factory.createUsuario(request.getParameter(nome),request.getParameter(login))
//insere no banco

É corente fazer deste jeito, ou eh necessário ter um objeto especficio para criar as instancias como uma factory por exemplo.

Orbigado

Opa,

Discordo da parte que repositório seja apenas para consultas, separar isso, a meu ver, é totalmente desnecessário

Objects can be added to and removed from the Repository, as they can from a simple collection of objects, and the mapping code encapsulated by the Repository will carry out the appropriate operations behind the scenes.

http://martinfowler.com/eaaCatalog/repository.html

A meu ver esse trecho diz claramente que o repositóro lida com operações de adição e remoção, assim sendo, porque não edição ?

PS

[quote=danielbussade][quote=sergiotaborda]
O padrão Repository tal como originalmente definido pelo Fowler não tem métodos de edição. Apenas de alteração.
Mas na arquitetura do Fowler existem outros objetos como os DAO e os DataMappers e companhia que seriam aquele X que falei.
[/quote]
Olá Sérgio obrigado pela resposta, mas ainda me resta algumas dúvidas, você diz que o repositório não tem metodos de edição apenas de alteração, não seriam a mesma coisa??
[/quote]

lol… foi um lapso. Eu pensei que escrevi “definido pelo Fowler não tem métodos de edição. Apenas de pesquisa”.

O repositório tem uma interface como uma lista. Vc comanda ele a fazer a operação de delete, add , etc…
normalmente vc tem dois metodos save (que faz updade e insert quando não existe ainda ) e delete.

Seria
Http -> Servlet -> Action > Service > Repository>DAO> SGDB e traz a informação necessária

HTTP + Servlet +Action = camada de apresentação
Service + Repositorio = camada de dominio (negocio)
DAO = camada de integração
SGDB = sistema externo

Não é proibido. Tudo depende da responsabilidade do action em relação à instancia.
dar new não é criar. Adicionar no repositorio é que é criar.

É normal vc dar new mas apenas para copiar os dados que vieram da tela, por exemplo.
O objeto fica igual ao que está no repositorio (ou diferente, se foi editado)
Vc envia isso para um serviço. O serviço decide o que fazer. Se vai chamar save ou delete , se envia email , se toca um som, sei lá… e chama o repositório.

Vc só usa o factory / builder se a criação do obejto for muito complexa ou se for automática. por exemplo vc passa o request e o builder lê e poe tudo nos campos certos. Ai blz.
Se for um simples setA, SetB pdoe fazer na mão. O ponto é que vc vai usar isso mais de uma vez, então um builder pode ser util mesmo nessa situação simples. É um trade-off que só vc pode decidir

[quote=GraveDigger]Opa,

Discordo da parte que repositório seja apenas para consultas, separar isso, a meu ver, é totalmente desnecessário

Objects can be added to and removed from the Repository, as they can from a simple collection of objects, and the mapping code encapsulated by the Repository will carry out the appropriate operations behind the scenes.

http://martinfowler.com/eaaCatalog/repository.html

A meu ver esse trecho diz claramente que o repositóro lida com operações de adição e remoção, assim sendo, porque não edição ?

[/quote]

A palavra chave é “can” (pode). Ele pode. Mas não é para isso que ele foi criado. Esse não é a força que guia a criação do padrão.
A força é a centralização das pesquisas. O reposiotiros está para as pesquisas como o DataMapper paras os insets; Ou seja, DatAMpper para tabelas e repositorios para views.

O fato dos repositorios poderem fazer mais funções não singifica que foram criados para isso.

Se vc ler a primeira linha ( que a descrição do que o padrã faz ):

O padrão é criado para acessar. Acessar == pesquisa =/= edição.

[quote=sergiotaborda][quote=GraveDigger]Opa,

Discordo da parte que repositório seja apenas para consultas, separar isso, a meu ver, é totalmente desnecessário

Objects can be added to and removed from the Repository, as they can from a simple collection of objects, and the mapping code encapsulated by the Repository will carry out the appropriate operations behind the scenes.

http://martinfowler.com/eaaCatalog/repository.html

A meu ver esse trecho diz claramente que o repositóro lida com operações de adição e remoção, assim sendo, porque não edição ?

[/quote][/quote]

Oi sérgio,

Continuo discordando:

Conceptually, a Repository encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer. 

Nesse trecho, mesma url que usei acima, mostra-se que o objetivo do Repository, mais do que consulta, é prover uma interface mais OO para a camada de persistência que não limita-se a pesquisas.

Acredito que as próprias palavras do Fowler não são tão precisas nesse sentido, ao menos não no site, pretendo verificar ainda esse mes quando chegar meu livro :slight_smile:

[]'s

Sérgio aqui você diz que tem dois metodos um save, e um delete, neste caso quando o save já tem dados, ele fará um update que seria uma edição. Isso não seria um erro , já que o repository deveria ter só metodos add, delete, e pesquisar, deixando as edições para o service.

Sérgio mas em uma operação de leitura eu não precisaria passar pelo service correto? POderia simplemente fazer isso:

Http -> Servlet -> Action > Repository>DAO> SGDB ou mesmo assim seria interessante ter um service que serveria apenas como um delegate para o Repository?

Essa parte eu não compreendi direito, usar mais de uma vez quer dizer usar em lugares diferentes da aplicação?
Porque se eu já tenho o metodo criado na action que cria a instância mesmo que eu use mais de uma vez, ele usaria sempre o mesmo método.

Poderia explicar melhor.

Obrigado

se respositório é onde estão os objetos, é pra onde eles vão também. OK? Não é dificil considerar o Repository uma Collection…