A quanto ho capito, un punto principale è quello di dividere la logica di dominio (Business Logic) dall'infrastruttura (DB, file system, ecc.).
Questo è il fondamento del malinteso: lo scopo di DDD non è quello di separare le cose su una linea dura come "questo è nel server SQL, quindi non deve essere BL", lo scopo di DDD è di separare domini e creare barriere tra quelli che consentono agli interni di un dominio di essere completamente separati dagli interni di un altro dominio e di definire esterni condivisi tra di loro.
Non pensare di "essere in SQL" come la barriera BL / DL, non è quello che è. Invece, pensa a "questa è la fine del dominio interno" come una barriera.
Ogni dominio dovrebbe avere API rivolte verso l'esterno che gli consentano di funzionare con tutti gli altri domini: nel caso del livello di archiviazione dei dati , dovrebbe avere azioni di lettura / scrittura (CRUD) per gli oggetti dati che memorizza. Ciò significa che SQL stesso non è in realtà la barriera, i componenti VIEW
e lo PROCEDURE
sono. Non dovresti mai leggere direttamente dalla tabella: questo è il dettaglio di implementazione che DDD ci dice che, come consumatore esterno, non dovremmo preoccuparci.
Considera il tuo esempio:
Quello che mi chiedo è: cosa succede quando ho query molto complesse come una query di calcolo delle risorse materiali? In quel tipo di query si lavora con operazioni con set pesanti, il tipo di cosa per cui è stato progettato SQL.
Questo è esattamente ciò che dovrebbe essere in SQL allora, e non è una violazione di DDD. È per questo che abbiamo creato DDD . Con quel calcolo in SQL, questo diventa parte del BL / DL. Che cosa si dovrebbe fare è utilizzare una vista separata / stored procedure / quello che-hanno-te, e mantenere la logica di business separata dal data-layer, come quello è il vostro API esterna. In effetti, il livello dati dovrebbe essere un altro livello dominio DDD, in cui il livello dati ha le proprie astrazioni per funzionare con gli altri livelli dominio.
Anche questi calcoli nell'infrastruttura non possono avvenire, poiché il modello DDD consente di modificare l'infrastruttura senza cambiare il livello di dominio e sapere che MongoDB non ha le stesse capacità di SQL Server, ad esempio, che non può accadere.
Questo è un altro malinteso: afferma che i dettagli di implementazione internamente possono cambiare senza cambiare altri livelli di dominio. Non dice che puoi semplicemente sostituire un intero pezzo di infrastruttura.
Ancora una volta, tieni presente che DDD riguarda nascondere gli interni con API esterne ben definite. Dove siedano quelle API è una domanda completamente diversa, e DDD non lo definisce. Definisce semplicemente che queste API esistono e non dovrebbero mai cambiare .
DDD non è configurato per consentire la sostituzione ad hoc di MSSQL con MongoDB, ovvero due componenti dell'infrastruttura totalmente diversi.
Invece, usiamo un'analogia per ciò che DDD definisce: gas vs auto elettriche. Entrambi i veicoli hanno due metodi completamente diversi per creare la propulsione, ma hanno le stesse API: un on / off, un acceleratore / freno e ruote per spingere il veicolo. DDD afferma che dovremmo essere in grado di sostituire il motore (gas o elettrico) nella nostra auto. Non dice che possiamo sostituire l'auto con una motocicletta, ed è effettivamente ciò che MSSQL → MongoDB è.