Sto lavorando in un'architettura, offrirà api di riposo per client Web e app mobili. Sto usando Spring (spring mvc, spring data jpa, ... ecc.). Il modello di dominio è codificato con le specifiche JPA.
Sto cercando di applicare alcuni concetti di architettura pulita ( https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html ). Non tutti, perché manterrò il modello di dominio jpa.
Il flusso effettivo attraverso i livelli è questo:
Front-end <--> Servizio API -> Servizio -> Repository -> DB
- Front-end : client Web, app mobili
- Servizio API : Rest Controller, qui utilizzo convertitori, dto e servizi di chiamata
- Servizio : si interfaccia con le implementazioni e contengono la logica aziendale
- Repository : il repository si interfaccia con le implementazioni automatiche (eseguite da jap di dati di primavera) che contagiano le operazioni CRUD e forse alcune query sql
Il mio dubbio: dovrei usare un ulteriore livello tra servizio e repository?
Sto pianificando questo nuovo flusso:
Front-end <--> Servizio API -> Servizio -> Persistenza -> Repository -> DB
Perché usare questo livello di persistenza? Come indicato nell'articolo sull'architettura pulita, vorrei avere un'implementazione del servizio (logica aziendale o caso d'uso) che acceda a un livello di persistenza agnostica. E non saranno necessarie modifiche se decido di utilizzare un altro modello di "accesso ai dati", ad esempio se decido di smettere di usare il repository.
class ProductServiceImpl implements ProductService {
ProductRepository productRepository;
void save(Product product) {
// do business logic
productRepository.save(product)
}
}
Quindi sto pensando di usare un livello di persistenza come questo:
class ProductServiceImpl implements ProductService {
ProductPersistence productPersistence;
void save(Product product) {
// do business logic
productPersistence.save(product)
}
}
e implementazione del livello di persistenza in questo modo:
class ProductPersistenceImpl implements ProductPersistence {
ProductRepository productRepository;
void save(Product product) {
productRepository.save(product)
}
}
Quindi ho solo bisogno di cambiare le implementazioni del livello di persistenza, ho lasciato il servizio senza cambiamenti. Insieme al fatto che il repository è correlato al framework.
Cosa ne pensi? Grazie.