Al momento abbiamo 2 applicazioni PHP che non condividono assolutamente alcun codice, ma condividono un database comune. Un'app è l'applicazione della scheda attività per gli amministratori, l'altra è la scheda attività che i dipendenti registrano il loro tempo rispetto ai progetti. Stiamo proponendo una ricostruzione completa dell'applicazione utilizzando Spring Boot, Spring Data Jpa, Hibernate, Java8. Vogliamo mantenere separate le applicazioni in quanto l'azienda potrebbe voler implementare e apportare modifiche in modo indipendente e presentare e prendere anche dati diversi, quindi non ha senso condividere comunque gli stessi modelli e API.
Le applicazioni non hanno ancora molte regole di business complesse, il sistema è metà entrata dati e metà segnalazione. Tuttavia nel tempo ci sono più funzionalità gestite manualmente che vogliamo essere nel sistema. Come tale vorrei prendere in prestito alcune delle idee di DDD e CQRS nel design.
La mia proposta è una soluzione Maven multi modulo
-- Timesheet (parent module)
-- timesheet-core
-- domain services
-- repositories
-- domain models / jpa entities
-- other common logic and classes
-- timesheet-web-admin
-- controllers / rest endpoints
-- services (will query from here for read operations, writes go through repositories)
-- DTOs (used to move data between client and other layers)
-- timesheet-employee-admin
-- controllers / rest endpoints
-- services (will query from here for read operations, writes go through repositories)
-- DTOs (used to move data between client and other layers)
Non sono uno che crede nel seguire rigorosamente schemi come una dottrina / religione. Penso che le idee e i modelli di DDD e CQRS potrebbero essere comunque utili. Abbiamo circa 100-120 persone che utilizzano questo sistema, quindi non sono sicuro che l'event sourcing e la creazione di database separati siano realmente necessari.
Questo design / architettura ha almeno un senso da un alto livello o sto facendo un terribile errore cercando di portare DDD nell'ovile? La mia idea è che JPA / Repository gestirà tutte le operazioni di scrittura, ma i servizi di applazione gestiranno le letture e restituiranno i dati negli oggetti DTO.