# Repositorios
El Repositorio es el encargado de proveer datos a los casos de uso. Estos datos son almacenados en modelos de negocio. Por tanto, el repositorio es el "almacén" de los modelos de negocio de nuestra aplicación.
El repositorio está formado por una estructura de dos clases:
- Repository: Es una interfaz que está en la capa de dominio y es con la que se comunique el caso de uso.
- DataRepository: Es una clase que está en la capa de datos y es la que implementa la interfaz del dominio.
El repositorio contiene toda la lógica sobre la gestión de los datos:
- Cómo se almacenan.
- Si se cachean en local o no.
- Si se obtienen de la fuente de datos local, remota u otra.
- Etc.
El repositorio obtiene los datos a través de los DataSources, por tanto, se apoyará en estas clases para recuperar y actualizar los datos.
La responsabilidad de decidir de qué fuente se obtienen los datos es del repositorio.
# Repository
Usamos una interfaz dentro del dominio para no tener una dependencia directa a la capa de datos (Regla de dependencia).
Un repositorio solo debe gestionar un modelo de datos para que sea lo más sencilla posible.
Importante
En la capa de dominio no debe existir ninguna relación directa al resto de capas. Esto se puede ver en los imports de las clases.
El repositorio tiene los métodos suficientes para recibir los datos requeridos por el caso de uso.
# Naming
Usaremos como nombre del repositorio la siguiente estructura:
{NombreModelo}Repository, ejemplo, SuperHeroeRepository.
Por norma general, un repository solo devuelve modelos del dominio y/o valores individuales: Integer, booleans, etc. relaciondos con el modelo.
# Ubicación
El repositorio se encuentra dentro de la capa de dominio y es una interfaz que debe ser implementada por la capa de datos.
El repositorio se pasa por constructor al caso de uso.
# DataRepository
Usamos una clase DataRepository para gestionar las distintas fuentes de datos disponibles.
Un repository solo trabaja con modelos del dominio. Nunca trabaja con modelos de Remoto o Locales.
WARNING
Si sólo existe una fuente de datos, es común que los equipos de software opten por usar el DataRepository como si fuera una implementación de una fuente de datos. Por ejemplo, si sólo vamos a usar Bases de Datos, es común meter el código que gestiona la base de datos en DataRepository.
# Naming
Usamos como nombre de la implementación del repositorio la siguiente estructura:
{NombreModelo}DataRepository, ejemplo, SuperHeroeDataRepository.
# Ubicación
El DataRepository se encuentra en la capa de datos.
# Ejemplos
Capa de Dominio
interface SuperHeroeRepository{
fun getSuperHeroes(): List<SuperHeroes>
}
2
3
Capa de Datos
class SuperHeroeDataRepository(val superHeroeLocalDataSource: LocalDataSource,
val superHeroeRemoteDataSource: RemoteDataSource) : SuperHeroeRepository{
override fun getSuperHeroes(): List<SuperHeroes>{
val superHeroes = superHeroeLocalDataSource.getAll()
if (superHeroes.isEmpty()){
superHeroes = superHeroeRemoteDataSource.getAll()
}
return superHeroes
}
}
2
3
4
5
6
7
8
9
10
11