Di hampir semua keadaan, kunci utama bukan bagian dari domain bisnis Anda. Tentu, Anda mungkin memiliki beberapa objek penting yang menghadap pengguna dengan indeks unik ( UserName
untuk pengguna atau OrderNumber
untuk pesanan) tetapi dalam kebanyakan kasus, tidak perlu berbisnis mengidentifikasi objek domain secara terbuka dengan satu nilai atau serangkaian nilai, kepada siapa pun, tetapi mungkin pengguna administratif. Bahkan dalam kasus luar biasa itu, terutama jika Anda menggunakan pengidentifikasi unik global (GUID) , Anda akan lebih suka atau ingin menggunakan kunci alternatif daripada mengekspos kunci primer itu sendiri.
Jadi, jika pemahaman saya tentang desain yang digerakkan oleh domain akurat, kunci primer tidak perlu dan karenanya tidak boleh diekspos, dan baguslah. Mereka jelek dan kram gaya saya. Tetapi jika kita memilih untuk tidak memasukkan kunci utama dalam model domain, ada konsekuensi:
- Secara naif, objek transfer data (DTO) yang berasal secara eksklusif dari kombinasi model domain tidak akan memiliki kunci utama
- DTO masuk tidak akan memiliki kunci utama
Jadi, apakah aman untuk mengatakan bahwa jika Anda benar-benar akan tetap murni dan menghilangkan kunci utama dalam model domain Anda, Anda harus siap untuk dapat menangani setiap permintaan dalam hal indeks unik pada kunci utama itu?
Dengan kata lain, solusi manakah di bawah ini yang merupakan pendekatan yang tepat untuk berurusan dengan mengidentifikasi objek tertentu setelah menghapus PK dalam model domain?
- Mampu mengidentifikasi objek yang perlu Anda tangani dengan atribut lain
- Mendapatkan kunci utama kembali di DTO; yaitu, menghilangkan PK saat memetakan dari kegigihan ke domain, lalu menggabungkan kembali PK saat memetakan dari domain ke DTO?
EDIT: Mari kita buat beton ini.
Mengatakan model domain saya VoIPProvider
yang meliputi bidang-bidang seperti Name
, Description
, URL
, serta referensi suka ProviderType
, PhysicalAddress
dan Transactions
.
Sekarang katakanlah saya ingin membangun layanan web yang akan memungkinkan pengguna istimewa untuk mengelola VoIPProvider
.
Mungkin ID ramah pengguna tidak berguna dalam kasus ini; setelah semua, penyedia VoIP adalah perusahaan yang namanya cenderung berbeda dalam pengertian komputer dan bahkan cukup berbeda dalam pengertian manusia untuk alasan bisnis. Jadi mungkin cukup untuk mengatakan bahwa yang unik VoIPProvider
sepenuhnya ditentukan oleh (Name, URL)
. Jadi sekarang katakanlah saya memerlukan metode PUT api/providers/voip
agar pengguna yang istimewa dapat memperbarui VoIP
penyedia. Mereka mengirim VoIPProviderDTO
, yang mencakup banyak tetapi tidak semua bidang dari VoIPProvider
, termasuk beberapa perataan berpotensi. Namun, saya tidak bisa membaca pikiran mereka, dan mereka masih perlu memberi tahu saya penyedia mana yang sedang kita bicarakan.
Sepertinya saya memiliki 2 (mungkin 3) opsi:
- Sertakan kunci utama atau kunci alternatif dalam model domain saya dan kirimkan ke DTO, dan sebaliknya
- Identifikasi penyedia yang kami pedulikan melalui indeks unik, seperti
(Name, Url)
- Memperkenalkan semacam objek perantara yang selalu dapat memetakan antara lapisan kegigihan, domain, dan DTO dengan cara yang tidak mengekspos detail implementasi tentang lapisan kegigihan - katakanlah dengan memperkenalkan pengidentifikasi sementara di dalam memori ketika pergi dari domain ke DTO dan kembali,