Ответ
Репозиторий — это паттерн слоя доступа к данным, который выступает в роли посредника между доменным слоем и слоем данных. Он инкапсулирует всю логику работы с хранилищем, предоставляя доменному слою коллекцию объектов в памяти.
Основные цели:
- Абстрагирование источника данных: Домен не знает, откуда берутся данные (БД, API, файл).
- Упрощение логики домена: Избавляет бизнес-логику от сложных запросов.
- Централизация запросов: Все запросы к данным находятся в одном месте.
Пример на Java (Spring Data JPA):
// 1. Доменная сущность
@Entity
class User {
@Id
private Long id;
private String email;
private boolean active;
}
// 2. Репозиторий как абстракция
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// Декларативный запрос по имени метода
Optional<User> findByEmail(String email);
List<User> findByActiveTrue();
// Кастомный JPQL-запрос
@Query("SELECT u FROM User u WHERE u.email LIKE %:domain")
List<User> findUsersByEmailDomain(@Param("domain") String domain);
}
// 3. Использование в сервисе (доменный слой)
@Service
class UserService {
private final UserRepository userRepo; // Зависимость от абстракции
public User getUserByEmail(String email) {
return userRepo.findByEmail(email)
.orElseThrow(() -> new UserNotFoundException(email));
}
}
Ключевые преимущества:
- Изоляция доменной логики от деталей инфраструктуры.
- Упрощение тестирования — репозиторий можно легко замокать.
- Единая точка для применения правил кэширования, спецификаций запросов и пагинации.