Introzione noiosa:DDD, gestione delle dipendenze
So che - DDD non riguarda la tecnologia. Per come la vedo io, DDD si occupa di creare un linguaggio ubiquo con il proprietario del prodotto e di rifletterlo in codice in modo così semplice e strutturato, che non può essere interpretato erroneamente o perso.
Ma ecco che entra in gioco un paradosso: per liberarsi del lato tecnico dell'applicazione nel modello di dominio, diventa un po 'tecnico - almeno dal punto di vista del design.
L'ultima volta che ho provato a seguire DDD - è finito con tutta la logica al di fuori degli oggetti di dominio in servizi "magici" tutt'intorno e un modello di dominio anemico.
Ho imparato alcuni nuovi trucchi ninja e mi chiedo se potrei gestire Goliath questa volta.
Problema:
class store : aggregateRoot {
products;
addProduct(product){
if (new FreshSpecification.IsSatisfiedBy(product))
products.add(product);
}
}
class product : entity {
productType;
date producedOn;
}
class productTypeValidityTerm : aggregateRoot {
productType;
days;
}
FreshSpecification
si suppone di specificare se il prodotto non puzza. Per fare ciò, dovrebbe controllare il tipo di prodotto, trovare da esso il tempo in cui il prodotto è fresco e confrontarlo con producedOn
. Gentile un semplice.
Ma ecco che arriva il problema - productTypeValidityTerm
e productType
devono essere gestiti dal cliente. Dovrebbe essere in grado di aggiungerli/modificarli liberamente. Poiché non posso attraversare direttamente dal prodotto a productTypeValidityTerm
, ho bisogno di interrogarli in qualche modo entro il productType
.
In precedenza, creerei qualcosa come ProductService
che riceve i necessari repository tramite il costruttore, termini di query, esegue un ulteriore voodoo e restituisce booleano (prendendo la logica pertinente più lontano dall'oggetto stesso e diffondendolo chissà dove).
ho pensato che potrebbe essere accettabile per fare qualcosa di simile:
addProduct(product, productTypeValidityTermRepository){...}
Ma poi di nuovo - non ho potuto comporre specifiche da più specifiche sotto liberamente ciò che è uno dei loro principali vantaggi.
Quindi - la domanda è, dove farlo? In che modo il negozio può essere a conoscenza dei termini?
+1 Buona domanda. Sono ancora alle prese con questo, ma ecco un tentativo precedente di rispondere a qualcosa di simile: http://stackoverflow.com/questions/1264944/refactoring-domain-logic-that-accesses-repositories-in-a-legacy-system/1265055 # 1265055 –