Каковы основные отличия между концепциями Manager, Repository и Service?

Здравствуйте. <br/> <br/> В чем заключается различие между классами с названиями Repository, Manager и Service? Я понимаю, что в классе Repository должны быть методы для работы с базой данных. Класс Manager выполняет аналогичные функции, но добавляет некоторую бизнес-логику при использовании Repository. Правильно ли это? Какие функции и обязанности должны быть у класса Service?
  • 6 января 2025 г. 15:54
Ответы на вопрос 2
Здравствуйте!

Вы правильно подметили, что классы `Repository`, `Manager` и `Service` выполняют разные роли в архитектуре приложения, и каждая из этих концепций имеет свои основные функции и обязанности.

### Repository
- **Определение**: Класс Repository отвечает за доступ к данным. Он инкапсулирует все операции, связанные с базой данных, такие как получение, сохранение, обновление и удаление сущностей.
- **Основные обязанности**:
  - Выполнение запросов к базе данных (например, SQL-запросов или вызов методов ORM).
  - Инкапсуляция логики доступа к данным, упрощая взаимодействие с внешними источниками данных.
  - Предоставление методов для работы с определенной сущностью (например, `getById`, `findAll`, `save`, `delete`).
- **Пример**: Класс `UserRepository` может содержать методы для получения пользователя по ID или сохранения нового пользователя.

### Manager
- **Определение**: Класс Manager предоставляет более высокоуровневую бизнес-логику и может использовать несколько Repository для выполнения более сложных операций.
- **Основные обязанности**:
  - Обработка бизнес-логики, которая может требовать взаимодействия с несколькими репозиториями.
  - Координация работы различных `Repository`, обеспечивая доступ к данным и их обработку.
  - Содержит методы, которые могут вызывать один или несколько методов из репозиториев, применяя к ним бизнес-правила.
- **Пример**: Класс `UserManager` может содержать метод для регистрации пользователя, который сначала проверяет, существует ли пользователь, а затем вызывает методы `UserRepository` для сохранения нового пользователя.

### Service
- **Определение**: Класс Service служит для предоставления функционала на уровне приложения и может выступать в качестве интерфейса между слоем представления и слоями данных (например, Manager и Repository).
- **Основные обязанности**:
  - Предоставление интерфейса для использования функционала приложения, часто через API.
  - Сосредоточение на бизнес-логике и обработке пользовательских вводов.
  - Может пользоваться как Manager, так и Repository для выполнения своей работы.
  - Обработка детейлевой логики, связанной с транзакциями или конкретными действиями пользователя с данными.
- **Пример**: Класс `UserService` может предоставлять методы, такие как `registerUser`, `loginUser`, которые используют `UserManager` для выполнения своих задач.

### Итог
- `Repository`: говорит о том, как и откуда получать данные, инкапсулируя доступ к хранилищу.
- `Manager`: работает на более высоком уровне, добавляя бизнес-логику к операциям с данными и координируя взаимодействие между различными репозиториями.
- `Service`: предоставляет интерфейс для использования бизнес-логики и доступа к данным на уровне приложения.

Соблюдение этих различий позволяет лучше структурировать код и улучшает его поддержку, тестируемость и масштабируемость.
Repository - это класс с методами для работы с бд, это правильно. 
Manager я обычно видел довольно редко(вообще не видел не на одном проекте), но если используется, то обычно он инкапсулирует логику репозиториев и может например вызывать несколько репозиториев в себе
Service если используются Manager, то обычно сервисы он взаимодействует с репозиториями или менедежрами, валидирует данные, логирует, обрабатывает какие-либо ошибки на этом уровне

но так как менеджеры я вообще не видел, то расскажу, как пишу и как обычно я видел на примере других проектов

Репозитории - взаимодействуют с бд
(На начальном этапе используйте их, перед собеседованием почитай про CQRS)
Сервисы - абстракция, которая инкапсулирует бизнес логику, например один сервис инкапсулирует логику репозитория, другой например отправляет сообщение другому микросервису или клиенту, другой реализует логику работы с внешним API
UseCase - использует сервисы для решения конкретоной бизнес задачи
Например создать новый товар, это же не просто кнопочку на фронте нажать, там много разных действий
В условиях монолита - это создать сам товар, указать его категорию, провалидировать что все корректно, добавить в бд, провалидировать что все нормально записалось, отправить какое-либо уведомление, связаться с внешним API(для каких-либо задач)

для работы с бд вы пишите репозитории, для валидации и инкапсуляции логики вы пишите сервисы, для отправки и связи с внешним API также сервисы, а для самого сценария вы делает UseCase который вызывает все нужные сервисы и уже этот UseCase вызывается в контроллере и контроллер отдает ответ клиенту

Заметь, что UseCase не должны напрямую с репозиториями взаимодействовать, а именно через абстракции, как раз сервисы

А в микросервисах, там еще больше операций, отправка к внешним микросервисам, обработка ответов и т.д
Надеюсь ответил на вопрос, а если я ошибся надеюсь меня исправят
Похожие вопросы