Вопрос проверяет понимание паттерна Repository и его роли в архитектуре приложения для абстракции доступа к данным.
Слой репозитория — это архитектурный паттерн, который инкапсулирует всю логику доступа к данным. Он действует как посредник между бизнес-логикой (доменным слоем) и источником данных (например, базой данных, внешним API). Основная цель — предоставить коллекцию объектов в памяти, скрывая сложные запросы и операции с базой данных.
findById, save), не зная, как данные реально извлекаются или сохраняются.Рассмотрим простой пример на TypeScript для сущности User. Сначала определим интерфейс репозитория, а затем его реализацию с использованием ORM, например, TypeORM.
// Интерфейс репозитория (абстракция)
interface UserRepository {
findById(id: string): Promise;
save(user: User): Promise;
findAll(): Promise;
}
// Доменная сущность
class User {
constructor(public id: string, public name: string) {}
}
// Конкретная реализация с TypeORM
class TypeOrmUserRepository implements UserRepository {
async findById(id: string): Promise {
// Здесь скрыта сложность запроса к БД
const userEntity = await userEntityRepository.findOne({ where: { id } });
return userEntity ? new User(userEntity.id, userEntity.name) : null;
}
async save(user: User): Promise {
await userEntityRepository.save({ id: user.id, name: user.name });
}
async findAll(): Promise {
const entities = await userEntityRepository.find();
return entities.map(e => new User(e.id, e.name));
}
}
// Использование в сервисе (бизнес-логика)
class UserService {
constructor(private userRepo: UserRepository) {}
async getUserName(id: string): Promise {
const user = await this.userRepo.findById(id);
if (!user) throw new Error('User not found');
return user.name;
}
}В этом примере сервис UserService зависит только от абстрактного интерфейса UserRepository. Это позволяет легко подменить реализацию, например, на InMemoryUserRepository для тестов.
Паттерн Repository широко используется в многослойных архитектурах, таких как Domain-Driven Design (DDD), Clean Architecture или Hexagonal Architecture. Он особенно полезен в средних и крупных приложениях, где важно разделение ответственности и поддержка кода.
Вывод: Слой репозитория стоит применять, когда нужно изолировать бизнес-логику от деталей хранения данных, повысить тестируемость и обеспечить гибкость для будущих изменений в способах доступа к данным.