Pracuję w architekturze, będzie oferować odpoczynek API dla klienta WWW i aplikacji mobilnych. Używam Spring (spring mvc, spring data jpa, ... itd.). Model domeny jest kodowany zgodnie ze specyfikacją JPA.
Próbuję zastosować pewne koncepcje czystej architektury ( https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html ). Nie wszystkie, ponieważ zamierzam zachować model domeny jpa.
Rzeczywisty przepływ przez warstwy jest następujący:
Zaczepy <-> API Usługi -> Usługi -> Repository -> DB
- Frontend : klient WWW, aplikacje mobilne
- Usługa API : kontrolery odpoczynku, tutaj korzystam z konwerterów oraz usług DTO i połączeń
- Usługa : interfejsy z implementacjami i zawierają logikę biznesową
- Repozytorium : Interfejsy repozytorium z automatycznymi implementacjami (wykonanymi przez Spring Data JPA), które mają wpływ na operacje CRUD i być może niektóre zapytania SQL
Moje wątpliwości: czy powinienem użyć dodatkowej warstwy między usługą a repozytorium?
Planuję ten nowy przepływ:
Zaczepy <-> API Usługi -> Usługi -> Trwałość -> Repository -> DB
Dlaczego warto korzystać z tej warstwy trwałości? Jak napisano w artykule o czystej architekturze, chciałbym mieć implementację usługi (logikę biznesową lub przypadek użycia), która ma dostęp do warstwy trwałości agnostycznej. I żadne zmiany nie będą potrzebne, jeśli zdecyduję się użyć innego wzorca „dostępu do danych”, na przykład jeśli zdecyduję się przestać używać repozytorium.
class ProductServiceImpl implements ProductService {
ProductRepository productRepository;
void save(Product product) {
// do business logic
productRepository.save(product)
}
}
Więc myślę, że użyj takiej warstwy trwałości:
class ProductServiceImpl implements ProductService {
ProductPersistence productPersistence;
void save(Product product) {
// do business logic
productPersistence.save(product)
}
}
i implementacja warstwy trwałości takiej jak ta:
class ProductPersistenceImpl implements ProductPersistence {
ProductRepository productRepository;
void save(Product product) {
productRepository.save(product)
}
}
Muszę więc tylko zmienić implementacje warstwy trwałości, opuściłem usługę bez zmian. W połączeniu z tym, że repozytorium jest powiązane z frameworkiem.
Co myślisz? Dzięki.