tl; dr
Mi è stato detto che nella progettazione basata sul dominio, un identificatore per un'entità potrebbe essere un oggetto valore personalizzato, cioè qualcosa diverso da Guid
, string
, int
, ecc. Può essere davvero consigliabile in un sistema distribuito?
Versione lunga
Inventerò una situazione analoga a quella che sto attualmente affrontando.
Dire che ho un sistema distribuito in cui un concetto centrale è un uovo. Il sistema consente di ordinare uova e visualizzare report di spesa e dati incentrati sull'inventario, come quantità a portata di mano, utilizzo, valutazione e ciò che hai. C'è una varietà di servizi che supportano questi comportamenti. E diciamo che c'è anche un'altra app che ti permette di comporre ricette che si collegano a un particolare tipo di uovo.
Ora il tipo di uovo è suddiviso tra specie di struzzo, oca, anatra, pollo, quaglia. Questo è bello e dandy perché significa che gli utenti non finiscono con le uova di struzzo quando vogliono uova di quaglia e quant'altro. Tuttavia, abbiamo ricevuto lamentele perché le uova di pollo jumbo non sono nemmeno simili a quelle piccole. Il prezzo è diverso, e in realtà non sono sostituibili nelle ricette. E qui pensavamo di fare un favore agli utenti non sovraccaricandoli con troppe opzioni.
Attualmente ciascuno dei servizi (diciamo OrderSubmitter
, EggTypeDefiner
, SpendingReportsGenerator
, InventoryTracker
, RecipeCreator
, RecipeTracker
, o qualsiasi altra cosa) identificano i tipi di uova con una rappresentazione integer standard di settore specie (chiamiamola speciesCode
). Ci rendiamo conto di aver rimediato perché questa modifica potrebbe influire su ogni servizio.
Ci sono due soluzioni di base proposte:
- Utilizza un tipo di identificatore predefinito come
Guid
comeeggTypeID
in tutti i servizi, ma rendiEggTypeDefiner
l'unico servizio che sa che esegue il mapping aspeciesCode
eeggSizeCode
(e potenzialmente aisOrganic
flag in futuro, o qualsiasi altra cosa). - Utilizza un oggetto valore
EggTypeID
che è una combinazione dispeciesCode
eeggSizeCode
in ogni servizio.
Ho proposto la prima soluzione perché spero che incapsuli meglio la definizione di che tipo di uovo è nella EggTypeDefiner
e sarà più resistente ai cambiamenti, diciamo se alcune persone ora vogliono differenziare le uova oppure no sono "organici".
La seconda soluzione è stata suggerita da alcune persone che capiscono il DDD meglio di me, nella speranza che meno arricchimento e ricerca saranno necessari in questo modo, con la giustificazione che in DDD si utilizza un oggetto valore come ID. Inoltre, stanno dicendo che EggTypeDefiner
non è un dominio e EggType
non è un'entità e come tale non dovrebbe avere Guid
per un ID.
Tuttavia, non sono sicuro che la seconda soluzione sia valida. Questo "oggetto valore" dovrà essere serializzato in JSON e URL per le richieste GET e utilizzato con una varietà di tecnologie (C #, JavaScript ...) che interrompe l'incapsulamento e quindi rimuove qualsiasi comportamento dell'oggetto identificativo (è o dei campi facoltativi? ecc.) È un caso in cui vogliamo evitare qualcosa che normalmente andrebbe bene in DDD perché stiamo provando a fare DDD in modo distribuito?
Sommario
Può essere una buona idea usare un oggetto valore personalizzato come identificatore in un sistema distribuito (soluzione # 2)?