Diferença entre repositório e serviço?

106

Qual é a diferença entre um repositório e um serviço? Eu não pareço entender.

Estou falando sobre acesso a dados por meio de uma camada de acesso a dados, normalmente com linq para sql.

Muitas vezes vejo repositórios com métodos CRUD simples e serviços com métodos mais específicos de negócios.

Podemos usar esta postagem do blog como exemplo. Se você olhar as interfaces na parte inferior (imagens), ele tem dois repositórios e dois serviços. Como saber o que colocar onde?

Como eu disse, os repositórios parecem ser mais para operações do tipo CRUD e serviços mais orientados para os negócios.

obrigado

alexn
fonte
Você pode calarificar? Em que contexto? Como a maioria das palavras, o contexto em que essas palavras estão sendo usadas ajuda a definir o significado.
David,
2
Nota: Não estou falando sobre serviços da web ou algo assim aqui. Estou falando sobre acesso a dados por meio de uma camada de dados.
alexn

Respostas:

78

Um Repositório é essencialmente uma fachada para persistência que usa semântica de estilo de coleção (Adicionar, Atualizar, Remover) para fornecer acesso a dados / objetos. É uma maneira de separar a maneira como você armazena dados / objetos do resto do aplicativo.

Um serviço fornece coordenação ou outros "serviços" necessários para operar seu aplicativo. Eles são muito diferentes porque os serviços normalmente não sabem como acessar os dados da persistência, e os repositórios geralmente acessam apenas os dados / objetos para quaisquer serviços que você possa ter.

Jlembke
fonte
19
Eu diria que um Repositório é um tipo de serviço usado para acesso a dados.
Ian Ringrose,
5
Essa é uma boa definição no sentido de que quase tudo que escrevemos é um "serviço" em algum nível, mas perde a intenção básica de que um repositório deveria ser uma coleção de objetos.
jlembke
4
Se você analisar os testes de unidade, pode ser mais claro pensar nos repositórios como a abstração mínima para minimizar a simulação necessária para evitar o banco de dados.
Henry Heikkinen
repository= collectionde backbone.jsou repository= servicede angular?
slideshowp2
160

O repositório é onde os dados são armazenados. O serviço é o que manipula os dados.

Em uma comparação de situação do mundo real, se o seu dinheiro estiver armazenado em um cofre de um banco, o cofre é o repositório. O caixa que deposita, retira, etc. é o serviço.

David
fonte
7
Obrigado por esta resposta! Simples e conciso.
alexn
1
concordou com o comentário acima! Ame a explicação do mundo real também!
Kleigh
6
milímetros. portanto, se o banco decidir se livrar do cofre e colocar o dinheiro embaixo do colchão, o caixa continuará a interagir com você como antes, sem que você precise saber sobre a mudança na camada do repositório.
Dennis
1
Suspeito que o cliente gostaria de saber sobre essa implementação, @Dennis
Chucky
1
@Dennis Sim. Esta é realmente uma das principais vantagens de usar o padrão de repositório. Você deve ser capaz de alterar a implementação real das interfaces do repositório sem alterar nada no serviço. Isso traz enormes benefícios para o teste de unidade e para tornar seu código fracamente acoplado.
Warren Parks
12

Eu diria como uma primeira tentativa, no sentido geral (até que você forneça mais contexto, se houver):

  • um repositório é onde você coloca alguns objetos globais, para serem usados ​​posteriormente.
  • um serviço é um código de lógica de negócios, tornado explícito (e idealmente separado da camada de apresentação e da camada de banco de dados?)
KLE
fonte
3
Estaria tudo bem fazer o seguinte então: Meu repositório tem todas as minhas chamadas complexas de banco de dados, então em meu serviço eu injeto o repositório como uma dependência. Agora eu tenho um código facilmente testável e separei minhas preocupações, porque meu serviço não sabe como as chamadas de DB são feitas, mas apenas chama as funções do repositório que sabe. Portanto, a lógica de negócios e o acesso aos dados são separados. Esta seria uma abordagem viável?
darophi
1
Se toda a lógica for escrita em serviços, o controlador apenas chamará o serviço?
Islomkhodja Hamidullakhodjaev