W prawie wszystkich okolicznościach klucze podstawowe nie są częścią domeny biznesowej. Pewnie, możesz mieć pewne ważne obiekty z unikalnymi indeksami ( UserName
dla użytkowników lub OrderNumber
zamówień), ale w większości przypadków nie ma potrzeby jawnego identyfikowania obiektów domeny za pomocą pojedynczej wartości lub zestawu wartości, dla kogokolwiek, ale może użytkownik administracyjny. Nawet w tych wyjątkowych przypadkach, szczególnie jeśli używasz globalnych unikalnych identyfikatorów (GUID) , polubisz lub zechcesz użyć alternatywnego klucza zamiast ujawniać sam klucz podstawowy.
Tak więc, jeśli moje rozumienie projektowania opartego na domenie jest dokładne, klucze podstawowe nie muszą, a zatem nie powinny być odsłonięte, i dobra gra. Są brzydkie i dręczą mój styl. Ale jeśli zdecydujemy się nie włączać kluczy podstawowych do modelu domeny, będą miały konsekwencje:
- Naiwnie obiekty przesyłania danych (DTO), które pochodzą wyłącznie z kombinacji modeli domen, nie będą miały kluczy podstawowych
- Przychodzące DTO nie będą miały klucza podstawowego
Czy można więc powiedzieć, że jeśli naprawdę chcesz zachować czystość i wyeliminować klucze podstawowe w modelu domeny, powinieneś być przygotowany na to, że będziesz w stanie obsłużyć każde żądanie w zakresie unikalnych indeksów tego klucza podstawowego?
Innymi słowy, które z poniższych rozwiązań jest właściwe podejście do identyfikowania poszczególnych obiektów po usunięciu PK w modelach domenowych?
- Umiejętność rozpoznawania obiektów, z którymi musisz się zmierzyć, na podstawie innych atrybutów
- Odzyskiwanie klucza podstawowego z powrotem w DTO; tj. eliminując PK podczas mapowania z trwałości do domeny, a następnie rekombinując PK przy mapowaniu z domeny do DTO?
EDYCJA: Zróbmy to konkretnie.
Powiedzieć moim modelu domeny VoIPProvider
, która obejmuje obszary takie jak Name
, Description
, URL
, jak również odnośników podoba ProviderType
, PhysicalAddress
i Transactions
.
Powiedzmy teraz, że chcę zbudować usługę internetową, która pozwoli uprzywilejowanym użytkownikom zarządzać VoIPProvider
s.
Być może przyjazny dla użytkownika identyfikator jest w tym przypadku bezużyteczny; w końcu dostawcy VoIP są firmami, których nazwy są zwykle wyraźne w sensie komputerowym, a nawet wystarczająco wyraźne w sensie ludzkim ze względów biznesowych. Być może wystarczy powiedzieć, że unikat VoIPProvider
jest całkowicie zdeterminowany (Name, URL)
. Powiedzmy teraz, że potrzebuję metody PUT api/providers/voip
, aby uprzywilejowani użytkownicy mogli aktualizować VoIP
dostawców. Wysyłają VoIPProviderDTO
, który zawiera wiele, ale nie wszystkie pola z VoIPProvider
, w tym niektóre potencjalnie spłaszczające. Nie umiem jednak czytać w ich myślach i nadal muszą mi powiedzieć, o którym dostawcy mówimy.
Wygląda na to, że mam 2 (może 3) opcje:
- Uwzględnij klucz podstawowy lub klucz alternatywny w moim modelu domeny i wyślij go do DTO i odwrotnie
- Zidentyfikuj dostawcę, na którym nam zależy, za pomocą unikalnego indeksu, np
(Name, Url)
- Wprowadź jakiś rodzaj obiektu pośredniego, który zawsze może mapować między warstwą trwałości, domeną i DTO w sposób, który nie ujawnia szczegółów implementacji dotyczących warstwy trwałości - powiedzmy, wprowadzając tymczasowy identyfikator w pamięci podczas przechodzenia z domeny do DTO iz powrotem,