Паттерн «Репозиторий»
Репозиторий представляет собой концепцию хранения коллекции для сущностей определенного типа.
Она не описывает хранение в базах данных или кэширование или решение любой другой технической проблемы.
Репозитории представляют коллекции.
Как вы храните эти коллекции — это просто деталь реализации.
Пример реализации (см. код)
Представьте, что у вас есть Singleton-экземпляр репозитория для сущностей Member
, MemberRepository
.
Затем создайте новый объект Member
и добавьте его в репозиторий. Позже, вы запросите у репозитория все элементы, хранящиеся в нем, таким образом вы получите коллекцию, которая содержит этот объект внутри. Возможно вы захотите получить какой-то конкретный объект по его ID, это также возможно.
Взаимодействие с репозиторием
Представьте, что мы создаем сущность Member
.
Мы приводим объект к необходимому состоянию, затем запрос заканчивается и объект исчезает.
Пользователь пытается авторизоваться в нашем приложении и не может. Очевидно, что нам необходимо сделать этот объект доступным и для других частей приложения.
member := &Member{email, password}
memberRepository.Save(member)
Позже мы сможем получить доступ к объекту
member := memberRepository.findByEmail(email)
members := memberRepository.getAll()
Должны ли репозитории создавать сущности
Если мы относимся к нашим репозиториям как к простым коллекциям, так значит и не нужно нагружать их лишним функционалом.
В чем выгода использования репозиторием?
Основное преимущество репозиториев — это абстрактный механизм хранения для коллекций сущностей.
Предоставляя интерфейс MemberRepository
мы развязываем руки разработчику, который уже сам решит как и где хранить данные.
type MemberRepository interface {
GetAll() []Member
Save(m *Member)
FindByEmail(email string) (Member, bool)
}
Теперь разработчик сможет сам определить реализацию хранения данных
type ArrayMemberRepository struct {}
func (m *ArrayMemberRepository) GetAll() []Member {
// ...
}
func (m *ArrayMemberRepository) Save(mb Member) {
// ...
}
func (m *ArrayMemberRepository) FindByEmail(email string) (Member, bool) {
// ...
}
Таким образом, большинство наших приложений знает только абстрактное понятие MemberRepository и его использование может быть отделено от фактической реализации.
Дополнительная информация
Весь текст взят из этой статьи, минимизирован и адаптирован под Go.