Ich arbeite in einer Architektur, die eine Rest-API für Web-Clients und mobile Apps bietet. Ich benutze Spring (spring mvc, spring data jpa, ... etc). Das Domänenmodell ist mit der JPA-Spezifikation codiert.
Ich versuche, einige Konzepte einer sauberen Architektur anzuwenden ( https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html ). Nicht alle, weil ich das jpa-Domain-Modell behalten werde.
Der tatsächliche Fluss durch die Schichten ist folgender:
Frontend <-> API-Service -> Service -> Repository -> DB
- Frontend : Webclient, mobile Apps
- API Service : Rest Controller, hier verwende ich Konverter und Dto's und Call Services
- Service : Schnittstellen zu Implementierungen, die Geschäftslogik enthalten
- Repository : Das Repository ist mit automatischen Implementierungen (von spring data jpa) verbunden, die CRUD-Operationen und möglicherweise einige SQL-Abfragen enthalten
Mein Zweifel: Soll ich eine zusätzliche Schicht zwischen Service und Repository verwenden?
Ich plane diesen neuen Ablauf:
Frontend <-> API-Service -> Service -> Persistenz -> Repository -> DB
Warum diese Persistenzschicht verwenden? Wie im Artikel über saubere Architektur angegeben, möchte ich eine Service-Implementierung (Geschäftslogik oder Anwendungsfall) haben, die auf eine agnostische Persistenzschicht zugreift. Und es sind keine Änderungen erforderlich, wenn ich mich für die Verwendung eines anderen "Datenzugriffs" -Musters entscheide, beispielsweise wenn ich mich entscheide, das Repository nicht mehr zu verwenden.
class ProductServiceImpl implements ProductService {
ProductRepository productRepository;
void save(Product product) {
// do business logic
productRepository.save(product)
}
}
Ich denke also, verwenden Sie eine Persistenzschicht wie diese:
class ProductServiceImpl implements ProductService {
ProductPersistence productPersistence;
void save(Product product) {
// do business logic
productPersistence.save(product)
}
}
und Implementierung der Persistenzschicht wie folgt:
class ProductPersistenceImpl implements ProductPersistence {
ProductRepository productRepository;
void save(Product product) {
productRepository.save(product)
}
}
Ich muss also nur die Implementierungen der Persistenzschicht ändern und den Dienst ohne Änderungen belassen. Verbunden mit der Tatsache, dass das Repository mit dem Framework verknüpft ist.
Was denkst du? Vielen Dank.