Sto imparando DDD. Per una pratica, sto provando a convertire la mia app in aggregati DDD.
Quello che ho capito finora su aggregato.
- L'aggregato definisce il limite della transazione
- Design aggregato il più piccolo possibile
- Se non esiste alcuna invariante da proteggere, potrei non aver bisogno di un aggregato.
- Devi caricare tutto da un aggregato.
Ho un semplice esempio. Quando un utente carica un'immagine e informazioni sull'immagine, la mia app crea prodotti basati sull'immagine.
Ho Asset
aggregato e Asset ha molte Product
entità (?)
class Asset
{
public function newProduct(ProductType $productType) {
// return a new Product object then save id internally
}
}
Quando aggiungo un nuovo prodotto a Asset, salvi l'id prodotto su Asset. Quando carico Asset dal proprio repository, ho un problema. Poiché ho più di 30 tipi di prodotto, non è ottimale caricare tutti i prodotti insieme. Poiché un prodotto non può esistere senza un asset e un id prodotto deve essere persistente in un asset, ho una logica aziendale da proteggere.
Devo davvero caricare tutti i prodotti quando carico un asset?
Posso avere un metodo in Asset che accetta un DAO per recuperare un prodotto su richiesta? o un servizio di dominio per recuperare un prodotto da un asset?
class Asset
{
public function getProduct(ProductType $productType, aDAO $dao){
}
}
Aggiornamento: l'asset non può avere un prodotto duplicato