Sto lavorando in un'architettura, offrirò un ambiente di riposo per client web e app mobili. Sto usando Spring (spring mvc, spring data jpa, ... ecc.). Il modello di dominio è codificato con specifica JPA.
Sto cercando di applicare alcuni concetti di architettura pulita ( link ). Non tutto, perché ho intenzione di mantenere il modello del 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 uso convertitori e servizi dto e call
- Servizio : si interfaccia con le implementazioni e contengono la logica aziendale
- Repository : Interfacce del repository con implementazioni automatiche (eseguite da Spring Data jpa) che contamina le operazioni CRUD e forse alcune query SQL
Il mio dubbio: dovrei usare un livello aggiuntivo tra servizio e repository?
Sto pianificando questo nuovo flusso:
Front-end < - > Servizio API - > Servizio - > Persistenza - > Repository - > DB
Perché usare questo livello di persistenza? Come si dice nell'articolo di architettura pulita, vorrei avere un'implementazione di servizio (logica aziendale o caso d'uso) che acceda a un livello di persistenza agnostico. E non saranno necessarie modifiche se decido di utilizzare un altro pattern 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, lasciato il servizio senza modifiche.Capito che il repository è correlato al framework.
Che ne pensi? Grazie.