Паттерн Repository инкапсулирует логику доступа к источнику данных (БД, API и т.п.), предоставляя слой абстракции между доменной логикой и механизмом хранения данных. Основная цель — скрыть детали реализации хранения и обеспечения работы с коллекцией объектов предметной области.
Преимущества:
Пример кода на C#:
public interface IUserRepository { User GetById(int id); void Add(User user); } public class UserRepository : IUserRepository { private readonly DbContext _context; public UserRepository(DbContext context) { _context = context; } public User GetById(int id) => _context.Users.Find(id); public void Add(User user) => _context.Users.Add(user); }
Ключевые особенности:
Обязан ли Repository знать о структуре базы данных?
Нет. Repository должен оперировать объектами предметной области и скрывать детали хранения. Отдельный Data Access Layer занимается маппингом на схему БД.
Можно ли смешивать бизнес-логику внутри класса-репозитория?
Нет. Это нарушает Separation of Concerns: Repository отвечает только за получение/сохранение данных. Бизнес-логика должна быть вынесена в сервисы/доменные объекты.
Repository и DAO — это одно и то же?
Не совсем. DAO ортогонален паттерну Repository, работает на уровне таблиц и записей, тогда как Repository — с объектами бизнес-логики. Repository абстрагирует коллекции бизнес-сущностей, DAO ближе к инфраструктуре.