Saya bertanya-tanya karena jika demikian, mengapa Entity Framework tidak menawarkan logika untuk membuat objek baru dengan properti yang sama untuk mentransfer data antar lapisan?
Saya menggunakan objek entitas yang saya hasilkan dengan kerangka kerja entitas.
design
design-patterns
architecture
domain-driven-design
entity-framework
pengguna2484998
sumber
sumber
Jawaban:
Ini terserah kamu.
Sebagian besar orang akan memberi tahu Anda bahwa itu bukan praktik yang baik tetapi dalam beberapa kasus Anda bisa melakukannya.
EF tidak pernah bermain bagus dengan DDD karena berbagai alasan, tetapi ada dua yang menonjol: Anda tidak dapat memiliki konstruktor berparameter pada entitas Anda dan Anda tidak dapat merangkum koleksi. DDD mengandalkan itu, karena model domain harus mencakup data dan perilaku.
Di satu sisi, EF memaksa Anda untuk memiliki model domain anemia dan dalam hal ini Anda dapat menggunakan entitas sebagai DTO. Anda dapat mengalami beberapa masalah jika Anda menggunakan properti navigasi tetapi Anda bisa membuat serial entitas tersebut dan mengirimkannya melalui kabel. Ini mungkin tidak praktis. Anda harus mengontrol serialisasi untuk setiap entitas yang memiliki properti yang tidak perlu Anda kirim. Cara yang lebih mudah adalah dengan mendesain kelas terpisah yang dirancang khusus untuk transfer data. Perpustakaan seperti AutoMapper dibuat untuk tujuan ini.
Sebagai contoh: Misalkan Anda memiliki kelas yang dipanggil
Person
dengan definisi berikut:Dengan asumsi Anda ingin menampilkan daftar karyawan di suatu tempat, mungkin praktis untuk mengirim saja
Id
,FirstName
danLastName
. Tetapi Anda harus mengirim semua properti yang tidak relevan lainnya. Ini bukan masalah besar jika Anda tidak peduli tentang ukuran respons tetapi ide umumnya adalah hanya mengirim data yang relevan. Di sisi lain, Anda dapat merancang API yang mengembalikan daftar orang dan dalam hal itu mengirim semua properti mungkin diperlukan, sehingga masuk akal untuk membuat cerita bersambung dan mengirim entitas. Dalam hal ini, membuat kelas DTO masih bisa diperdebatkan. Beberapa orang suka mencampuradukkan entitas dan DTO, beberapa orang tidak.Untuk menjawab pertanyaan Anda yang diperbarui, EF adalah ORM. Tugasnya adalah memetakan catatan basis data ke objek dan sebaliknya. Apa yang Anda lakukan dengan benda-benda itu sebelum dan sesudah melewati EF bukan bagian dari keprihatinannya. Seharusnya juga tidak.
sumber
As of EF Core 2.1, only services known by EF Core can be injected. Support for injecting application services is being considered for a future release.
Saya sangat suka memiliki layanan aplikasi yang disuntikkan ke entitas saya.Tidak, bukan.
Idealnya, DTO akan cocok dengan repositori kegigihan Anda (alias, tabel database Anda).
Tetapi kelas bisnis Anda belum tentu cocok. Anda mungkin perlu kelas tambahan, atau dipisahkan, atau bergabung dengan kelas untuk apa yang Anda miliki dalam database. Jika aplikasi Anda kecil, Anda mungkin tidak benar-benar melihat masalah seperti ini, tetapi dalam aplikasi menengah hingga besar, ini akan sering terjadi.
Hal lain adalah bahwa DTO adalah bagian dari domain apa pun yang berhubungan dengan kegigihan, sementara Layer Bisnis Anda seharusnya tidak tahu apa-apa tentang mereka.
sumber
Ini sebenarnya ide yang sangat buruk. Martin Fowler memiliki artikel tentang DTO Lokal .
Singkat cerita,
DTO
Pola digunakan untuk mentransfer data di luar proses, misalnya melalui kabel dan bukan di antara lapisan dalam proses yang sama.sumber
Tidak, ini praktik yang buruk.
Beberapa alasan:
@JsonIgnore
dari dunia Java), tetapi ini mengarah ke masalah berikutnya ...get
metode entitas.Jadi, lebih mudah dan aman menggunakan semacam alat mapper untuk membantu Anda dalam pekerjaan ini, memetakan bidang entitas ke Dto.
sumber
Untuk menyelesaikan apa yang dikatakan @Dikerik, masalah utama menggunakan objek entitas sebagai objek transfer data adalah:
Dalam suatu transaksi, Anda mengambil risiko untuk melakukan perubahan yang dilakukan pada entitas Anda karena Anda menggunakannya sebagai DTO (bahkan jika Anda dapat melepaskan entitas sesi dalam transaksi, sebagian besar waktu Anda perlu memeriksa keadaan ini sebelum modifikasi pada entitas Anda-DTO dan pastikan bahwa Anda tidak dalam transaksi atau bahwa sesi telah ditutup jika Anda tidak ingin modifikasi tetap ada).
Ukuran data yang Anda bagikan antara klien dan server: kadang-kadang Anda tidak ingin mengirim semua konten entitas ke klien untuk meminimalkan ukuran respons permintaan. Memisahkan DTO dari entitas lebih fleksibel, sehingga untuk mengkhususkan data yang ingin Anda kirim dalam kasus penggunaan tertentu.
Visibilitas dan pemeliharaan: Anda harus mengelola jpa / hibernasi anotasi pada bidang entitas Anda dan mempertahankan anotasi jackson untuk diserialisasi dalam json di tempat yang sama (bahkan jika Anda dapat memisahkannya dari implementasi entitas dalam menempatkannya di antarmuka yang diwarisi oleh kesatuan). Kemudian, jika Anda mengubah konten DTO Anda dalam menambahkan bidang baru, orang lain mungkin bisa berpikir bahwa itu adalah bidang entitas, oleh karena itu bidang tabel yang bersangkutan dalam database Anda (bahkan jika Anda dapat menggunakan
@Transient
anotasi pada semua bidang DTO Anda untuk kasus ini ..!).Menurut pendapat saya, itu menciptakan kebisingan ketika Anda membaca entitas, tetapi pendapat saya pasti subjektif.
sumber