Estoy trabajando en una arquitectura, va a ofrecer una API de descanso para clientes web y aplicaciones móviles. Estoy usando Spring (spring mvc, spring data jpa, ... etc.). El modelo de dominio está codificado con la especificación JPA.
Estoy tratando de aplicar algunos conceptos de arquitectura limpia ( https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html ). No todo, porque voy a mantener el modelo de dominio jpa.
El flujo real a través de las capas es este:
Front end <--> Servicio API -> Servicio -> Repositorio -> DB
- Front end : cliente web, aplicaciones móviles
- Servicio API : Rest Controllers, aquí uso convertidores y dto's y servicios de llamadas
- Servicio : Interfaces con implementaciones y contienen lógica de negocios.
- Repositorio : interfaces de repositorio con implementaciones automáticas (realizadas por spring data jpa) que contienen operaciones CRUD y quizás algunas consultas sql
Mi duda: ¿Debo usar una capa adicional entre el servicio y el repositorio?
Estoy planeando este nuevo flujo:
Front end <--> Servicio API -> Servicio -> Persistencia -> Repositorio -> DB
¿Por qué usar esta capa de persistencia? Como dice en el artículo de arquitectura limpia, me gustaría tener una implementación de servicio (lógica de negocios o caso de uso) que acceda a una capa de persistencia agnóstica. Y no se necesitarán cambios si decido usar otro patrón de "acceso a datos", por ejemplo, si decido dejar de usar el repositorio.
class ProductServiceImpl implements ProductService {
ProductRepository productRepository;
void save(Product product) {
// do business logic
productRepository.save(product)
}
}
Así que estoy pensando en usar una capa de persistencia como esta:
class ProductServiceImpl implements ProductService {
ProductPersistence productPersistence;
void save(Product product) {
// do business logic
productPersistence.save(product)
}
}
e implementación de la capa de persistencia como esta:
class ProductPersistenceImpl implements ProductPersistence {
ProductRepository productRepository;
void save(Product product) {
productRepository.save(product)
}
}
Por lo tanto, solo necesito cambiar las implementaciones de la capa de persistencia, dejé el servicio sin cambios. Junto con el hecho de que el repositorio está relacionado con el marco.
¿Qué piensas? Gracias.