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 ( UserNameper utenti o OrderNumberper 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 è VoIPProviderche comprende campi come Name, Description, URL, così come riferimenti, come ProviderType, PhysicalAddresse Transactions.
Ora diciamo che voglio costruire un servizio web che consentirà agli utenti privilegiati di gestire VoIPProvideri 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/voipmodo che gli utenti privilegiati possano aggiornare i VoIPprovider. 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,