In quasi tutte le circostanze, le chiavi primarie non fanno parte del tuo dominio aziendale. Certo, potresti avere alcuni importanti oggetti rivolti all'utente con indici univoci ( UserName
per gli utenti o OrderNumber
per gli ordini) ma nella maggior parte dei casi, non c'è bisogno di business per identificare apertamente gli oggetti del dominio un singolo valore o un insieme di valori, per chiunque ma forse un utente amministrativo. Anche in questi casi eccezionali, specialmente se utilizzi identificatori univoci globali (GUID) , ti piacerebbe o vorresti utilizzare un chiave alternativa invece di esporre la chiave primaria stessa.
Quindi, se la mia comprensione della progettazione basata sul dominio è accurata, le chiavi primarie non sono necessarie e quindi non dovrebbe essere esposto, e una buona liberazione. Sono brutti e strattonano il mio stile. Ma se scegliamo di non includere le chiavi primarie nel modello di dominio, ci sono conseguenze:
- Naively, DTO (data transfer objects) che derivano esclusivamente da combinazioni di modelli di dominio non avranno chiavi primarie
- I DTO in arrivo non avranno una chiave primaria
Quindi, è sicuro dire che se si vuole rimanere puri ed eliminare le chiavi primarie nel proprio modello di dominio, si dovrebbe essere pronti a gestire ogni richiesta in termini di indici univoci su quella chiave primaria?
In altre parole, quale delle seguenti soluzioni rappresenta l'approccio corretto per gestire l'identificazione di oggetti particolari dopo la rimozione di PK nei modelli di dominio?
- Essere in grado di identificare gli oggetti che devi affrontare con altri attributi
- Restituire la chiave primaria nel DTO; cioè, eliminando il PK quando si esegue il mapping dalla persistenza al dominio, quindi ricombinando il PK quando si esegue il mapping dal dominio al DTO?
MODIFICA: rendiamolo concreto.
Il mio modello di dominio è VoIPProvider
che include campi come Name
, Description
, URL
, nonché riferimenti come ProviderType
, PhysicalAddress
e Transactions
.
Ora diciamo che voglio creare un servizio Web che consenta agli utenti con privilegi di gestire VoIPProvider
s.
Forse un ID user-friendly è inutile in questo caso; dopo tutto, i provider VoIP sono aziende i cui nomi tendono ad essere distinti nel senso del computer e persino abbastanza distinti dal punto di vista umano per ragioni di business. Quindi potrebbe essere sufficiente dire che un VoIPProvider
unico è completamente determinato da (Name, URL)
. Quindi ora diciamo che ho bisogno di un metodo PUT api/providers/voip
in modo che gli utenti con privilegi possano aggiornare VoIP
provider. Invia un VoIPProviderDTO
, che include molti ma non tutti i campi da VoIPProvider
, incluso un po 'di appiattimento potenzialmente. Tuttavia, non posso leggere le loro menti, e hanno ancora bisogno di dirmi di quale fornitore stiamo parlando.
Sembra che abbia 2 (forse 3) opzioni:
- Includere una chiave primaria o una chiave alternativa nel mio modello di dominio e inviarla al DTO e viceversa
- Identifica il provider che ci interessa tramite l'indice univoco, come
(Name, Url)
- Introduci una sorta di oggetto intermedio che può sempre mappare tra livello di persistenza, dominio e DTO in un modo che non espone dettagli di implementazione sul livello di persistenza, ad esempio introducendo un identificatore temporaneo in memoria quando si passa da dominio a DTO e ritorno,