Я работаю в архитектуре, она собирается предложить API отдыха для веб-клиента и мобильных приложений. Я использую Spring (Spring MVC, Spring данных JPA, ... и т. Д.). Модель предметной области закодирована со спецификацией JPA.
Я пытаюсь применить некоторые концепции чистой архитектуры ( https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html ). Не все, потому что я собираюсь сохранить модель домена jpa.
Фактический поток через слои таков:
Внешний интерфейс <-> Служба API -> Служба -> Репозиторий -> БД
- Внешний интерфейс: веб-клиент, мобильные приложения
- API Service : Rest Controllers, здесь я использую конвертеры и сервисы dto's и call
- Сервис : Интерфейсы с реализациями, и они содержат бизнес-логику
- Репозиторий : интерфейсы репозитория с автоматическими реализациями (выполняемыми Spring data jpa), которые содержат операции CRUD и, возможно, некоторые SQL-запросы.
Мое сомнение: я должен использовать дополнительный слой между службой и хранилищем?
Я планирую этот новый поток:
Внешний интерфейс <-> Служба API -> Служба -> Постоянство -> Репозиторий -> БД
Зачем использовать этот постоянный слой? Как говорится в статье о чистой архитектуре, я хотел бы иметь реализацию службы (бизнес-логика или сценарий использования), которая имеет доступ к слою постоянства. И никакие изменения не потребуются, если я решу использовать другой шаблон «доступа к данным», например, если я решу прекратить использование репозитория.
class ProductServiceImpl implements ProductService {
ProductRepository productRepository;
void save(Product product) {
// do business logic
productRepository.save(product)
}
}
Так что я думаю использовать постоянный слой, подобный этому:
class ProductServiceImpl implements ProductService {
ProductPersistence productPersistence;
void save(Product product) {
// do business logic
productPersistence.save(product)
}
}
и реализация персистентного слоя, как это:
class ProductPersistenceImpl implements ProductPersistence {
ProductRepository productRepository;
void save(Product product) {
productRepository.save(product)
}
}
Поэтому мне нужно только изменить реализации уровня персистентности, оставив сервис без изменений. В сочетании с тем, что репозиторий связан с фреймворком.
Что вы думаете? Спасибо.