In quasi tutte le circostanze, le chiavi primarie non fanno parte del dominio aziendale. Certo, potresti avere alcuni importanti oggetti rivolti all'utente con indici univoci ( UserName
per utenti o OrderNumber
per ordini) ma nella maggior parte dei casi, non è necessario che le aziende identifichino apertamente gli oggetti di dominio con un singolo valore o insieme di valori, a chiunque ma forse un utente amministrativo. Anche in questi casi eccezionali, specialmente se si utilizzano identificatori univoci globali (GUID) , si desidera o si desidera utilizzare una chiave alternativa anziché esporre la chiave primaria stessa.
Quindi, se la mia comprensione del design guidato dal dominio è accurata, le chiavi primarie non devono e quindi non devono essere esposte e una buona liberazione. Sono brutti e restringono il mio stile. Ma se scegliamo di non includere le chiavi primarie nel modello di dominio, ci sono conseguenze:
- Ingenuamente, gli oggetti di trasferimento dati (DTO) derivati esclusivamente da combinazioni di modelli di dominio non avranno chiavi primarie
- I DTO in arrivo non avranno una chiave primaria
Quindi, è sicuro di dire che se vuoi davvero rimanere puro ed eliminare le chiavi primarie nel tuo modello di dominio, dovresti essere pronto a gestire ogni richiesta in termini di indici univoci su quella chiave primaria?
Detto in altro modo, quale delle seguenti soluzioni è l'approccio corretto per gestire l'identificazione di oggetti particolari dopo aver rimosso PK nei modelli di dominio?
- Essere in grado di identificare gli oggetti che devi affrontare con altri attributi
- Ripristino della chiave primaria nel DTO; vale a dire, eliminare il PK durante il mapping dalla persistenza al dominio, quindi ricombinare il PK durante il mapping dal dominio al DTO?
EDIT: Facciamo questo concreto.
Dire il mio modello di dominio è VoIPProvider
che comprende campi come Name
, Description
, URL
, così come riferimenti, come ProviderType
, PhysicalAddress
e Transactions
.
Ora diciamo che voglio costruire un servizio web che consentirà agli utenti privilegiati di gestire VoIPProvider
i messaggi di posta elettronica .
Forse un ID intuitivo è inutile in questo caso; dopo tutto, i provider VoIP sono aziende i cui nomi tendono ad essere distinti in senso informatico e persino abbastanza distinti in senso umano per motivi di lavoro. Quindi potrebbe essere sufficiente dire che un unico VoIPProvider
è completamente determinato da (Name, URL)
. Quindi ora diciamo che ho bisogno di un metodo in PUT api/providers/voip
modo che gli utenti privilegiati possano aggiornare i VoIP
provider. Inviano a VoIPProviderDTO
, che include molti ma non tutti i campi da VoIPProvider
, incluso alcuni potenzialmente appiattimento. Tuttavia, non riesco a leggere le loro menti e devono ancora dirmi di quale provider stiamo parlando.
Sembra che io abbia 2 (forse 3) opzioni:
- Includere una chiave primaria o alternativa nel mio modello di dominio e inviarlo al DTO e viceversa
- Identifica il fornitore a cui teniamo tramite l'indice univoco, ad esempio
(Name, Url)
- Introduci una sorta di oggetto intermedio che può sempre mappare tra livello di persistenza, dominio e DTO in un modo che non esponga i dettagli di implementazione sul livello di persistenza, ad esempio introducendo un identificatore temporaneo in memoria quando passi da dominio a DTO e viceversa,