W prawie wszystkich okolicznościach klucze podstawowe nie są częścią domeny biznesowej. Pewnie, możesz mieć pewne ważne obiekty z unikalnymi indeksami ( UserNamedla użytkowników lub OrderNumberzamó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, PhysicalAddressi Transactions.
Powiedzmy teraz, że chcę zbudować usługę internetową, która pozwoli uprzywilejowanym użytkownikom zarządzać VoIPProviders.
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 VoIPProviderjest całkowicie zdeterminowany (Name, URL). Powiedzmy teraz, że potrzebuję metody PUT api/providers/voip, aby uprzywilejowani użytkownicy mogli aktualizować VoIPdostawcó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,