Je travaille dans une architecture, elle va proposer une api de repos pour le client web et les applications mobiles. J'utilise Spring (spring mvc, spring data jpa, ... etc). Le modèle de domaine est codé avec la spécification JPA.
J'essaie d'appliquer certains concepts d'architecture propre ( https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html ). Pas tous, car je vais garder le modèle de domaine jpa.
Le flux réel à travers les couches est le suivant:
Front-end <--> Service API -> Service -> Référentiel -> DB
- Front end : client web, applications mobiles
- Service API : Rest Contrôleurs, ici j'utilise des convertisseurs et des dto et des services d'appel
- Service : Interfaces avec les implémentations et elles contiennent la logique métier
- Référentiel : le référentiel s'interface avec des implémentations automatiques (effectuées par Spring Data JPA) qui contatinent les opérations CRUD et peut-être certaines requêtes SQL
Mon doute: dois-je utiliser une couche supplémentaire entre le service et le référentiel?
Je prévois ce nouveau flux:
Front end <--> Service API -> Service -> Persistance -> Référentiel -> DB
Pourquoi utiliser cette couche de persistance? Comme il est dit dans l'article sur l'architecture propre, j'aimerais avoir une implémentation de service (logique métier ou cas d'utilisation) qui accède à une couche de persistance agnostique. Et aucune modification ne sera nécessaire si je décide d'utiliser un autre modèle "d'accès aux données", par exemple si je décide d'arrêter d'utiliser le référentiel.
class ProductServiceImpl implements ProductService {
ProductRepository productRepository;
void save(Product product) {
// do business logic
productRepository.save(product)
}
}
Je pense donc utiliser une couche de persistance comme celle-ci:
class ProductServiceImpl implements ProductService {
ProductPersistence productPersistence;
void save(Product product) {
// do business logic
productPersistence.save(product)
}
}
et l'implémentation de la couche de persistance comme ceci:
class ProductPersistenceImpl implements ProductPersistence {
ProductRepository productRepository;
void save(Product product) {
productRepository.save(product)
}
}
J'ai donc seulement besoin de changer les implémentations de la couche de persistance, laissé le service sans changements. Couplé avec le fait que le référentiel est lié au framework.
Qu'est-ce que tu penses? Merci.