¿Diferencia entre repositorio y servicio?

105

¿Cuál es la diferencia entre un repositorio y un servicio? No parezco comprenderlo.

Estoy hablando de acceso a datos a través de una capa de acceso a datos, normalmente con linq to sql.

Muy a menudo veo repositorios con métodos CRUD simples y servicios con métodos más específicos de la empresa.

Podemos tomar esta publicación de blog como ejemplo. Si miras las interfaces en la parte inferior (imágenes), tiene dos repositorios y dos servicios. ¿Cómo saber qué poner y dónde?

Como dije, los repositorios parecen ser más para operaciones similares a CRUD y Servicios más orientados a los negocios.

Gracias

alexn
fuente
¿Puedes calarificar? ¿En que contexto? Como la mayoría de las palabras, el contexto en el que se utilizan estas palabras ayuda a definir el significado.
David
2
Nota: No estoy hablando de servicios web ni nada por el estilo. Me refiero al acceso a los datos a través de una capa de datos.
alexn

Respuestas:

78

Un repositorio es esencialmente una fachada para la persistencia que utiliza la semántica del estilo de la colección (Agregar, Actualizar, Eliminar) para proporcionar acceso a datos / objetos. Es una forma de desacoplar la forma en que almacena datos / objetos del resto de la aplicación.

Un servicio proporciona coordinación u otros "servicios" necesarios para operar su aplicación. Son muy diferentes en que los Servicios no suelen saber cómo acceder a los datos de forma persistente, y los repositorios normalmente solo acceden a los datos / objetos de cualquier servicio que pueda tener.

jlembke
fuente
19
Yo diría que un repositorio es un tipo de servicio que se utiliza para acceder a datos.
Ian Ringrose
5
Esa es una buena definición en el sentido de que casi todo lo que escribimos es un "servicio" en algún nivel, pero pierde la intención básica de que se supone que un repositorio es una colección de objetos.
jlembke
4
Si asimila las pruebas unitarias, podría ser más claro pensar en los repositorios como la abstracción mínima para minimizar las burlas necesarias para evitar la base de datos.
Henry Heikkinen
repository= collectiondesde backbone.jso repository= servicedesde angular?
slideshowp2
159

El repositorio es donde se almacenan los datos. El servicio es lo que manipula los datos.

En una comparación de situaciones del mundo real, si su dinero se almacena en una bóveda en un banco, la bóveda es el depósito. El cajero que deposita, retira, etc es el servicio.

David
fuente
7
¡Gracias por esta respuesta! Simple y conciso.
alexn
1
de acuerdo con el comentario anterior! ¡Me encanta la explicación del mundo real también!
Kleigh
6
mm. así que si el banco decide deshacerse de la bóveda y poner dinero debajo de los colchones, el cajero seguirá interactuando con usted como antes, sin que usted tenga que saber sobre el cambio en la capa del repositorio.
Dennis
1
Sospecho que el cliente querría saber sobre esa implementación, @Dennis
Chucky
1
@Dennis Sí. En realidad, esta es una de las principales ventajas de utilizar el patrón de repositorio. Debería poder cambiar la implementación real de las interfaces del repositorio sin cambiar nada en el servicio. Esto tiene enormes beneficios para las pruebas unitarias y hace que su código esté poco acoplado.
Warren Parks
12

Yo diría como primer intento, en el sentido general (hasta que le des más contexto si tienes uno):

  • un repositorio es donde colocas algunos objetos globales, para usarlos más tarde.
  • un servicio es un código de lógica empresarial, hecho explícito (¿e idealmente separado de la capa de presentación y la capa de base de datos?)
KLE
fuente
3
Entonces, ¿estaría bien hacer lo siguiente? Mi repositorio tiene todas mis llamadas complejas a la base de datos, luego en mi servicio inyecto el repositorio como una dependencia. Ahora tengo un código fácilmente comprobable y separé mis preocupaciones, porque mi servicio no sabe cómo se realizan las llamadas a la base de datos, sino que simplemente llama a las funciones del repositorio que sí lo hace. Por lo tanto, la lógica empresarial y el acceso a los datos están separados. ¿Sería este un enfoque viable?
darophi
1
Si toda la lógica está escrita en los servicios, ¿entonces el controlador solo llamará al servicio?
Islomkhodja Hamidullakhodjaev