Saya memiliki keraguan serius tentang desain untuk aplikasi Web saya.
Saya ingin memisahkan logika bisnis dari antarmuka jadi saya membuat Web API yang menangani semua permintaan ke database.
Ini adalah ASP.NET Web API dengan kerangka kerja Entity dan unit kerja serta pola repositori umum. Sejauh ini semuanya baik-baik saja.
MASALAH
Di mana saya perlu bantuan adalah saya tidak dapat menemukan cara berbagi objek yang efisien antara API dan aplikasi.
Saya tidak ingin membuat cerita bersambung langsung objek entitas, saya pikir ini akan menjadi praktik yang buruk karena jika model entitas berubah, saya bisa berakhir dengan membuat serial objek besar tanpa alasan.
Bagaimana ini diterapkan sekarang
Karena antarmuka saya adalah aplikasi Web ASP.NET di C # dan API saya di C #, saya membuat perpustakaan umum dengan definisi semua kelas yang ingin saya bagikan di antara mereka.
Saya tahu bahwa solusi tidak akan berfungsi ketika saya akan mengembangkan aplikasi android, saya harus membuat kelas saya lagi di Jawa tapi itu bukan masalah terbesar saya.
Masalahnya adalah saya merasa seperti saya selalu mengubah objek saya.
CONTOH
Inilah contoh alur pekerjaan saya:
Saya mulai dengan model dengan semua objek dan anotasi data untuk formulir saya kemudian pengguna akan POST model itu ke controller.
Dalam controller saya harus mengubah model ini ke kelas di perpustakaan umum saya kemudian mengirim objek itu ke API saya.
Kemudian pengontrol di API saya menangkap panggilan dan mengonversi objek itu ke objek entitas untuk memperbarui database.
Jadi saya punya 3 kelas
- Model untuk tampilan dengan semua anotasi data untuk validasi (Klien)
- Kelas-kelas perpustakaan umum untuk berbagi objek (DLL)
- Kelas Entitas (API)
Saya merasa bahwa saya melakukan sesuatu yang sangat salah. Apakah ada sesuatu yang lebih elegan? Saya ingin memastikan bahwa saya memiliki solusi yang baik untuk masalah ini sebelum proyek menjadi terlalu besar.
Jawaban:
Saya tahu ini mungkin tampak seperti Anda mengubah objek bolak-balik sepanjang waktu antara objek database Anda, objek transfer data Anda, objek klien Anda dengan logika validasi dan sebagainya, tetapi saya akan mengatakan bahwa tidak, Anda tidak melakukan kesalahan apa pun .
Setiap objek ini dapat mewakili unit informasi yang sama, tetapi mereka memiliki tanggung jawab yang sangat berbeda. Objek basis data adalah antarmuka komunikasi Anda dengan basis data dan harus disimpan dalam lapisan basis data karena mungkin atau mungkin tidak memiliki anotasi metadata basis data yang berbeda dan / atau detail yang tidak perlu tentang implementasi basis data di dalamnya.
Objek transfer data Anda adalah antarmuka komunikasi dengan konsumen API Anda. Ini harus sebersih mungkin untuk memfasilitasi konsumsi yang mudah dari berbagai bahasa / platform. Ini mungkin memberlakukan batasan tertentu pada bagaimana ini terlihat dan berperilaku tergantung pada apa yang konsumen API ingin Anda dukung.
Objek klien Anda dengan logika validasi sebenarnya bukan bagian dari proyek API Anda, mereka adalah bagian dari proyek konsumen Anda. Ini tidak bisa sama dengan objek transfer data dalam kasus ini karena Anda menambahkan logika khusus klien tambahan (dalam hal ini atribut validasi) pada mereka yang server tidak tahu apa-apa tentang (dan seharusnya tidak tahu apa-apa!) Anda tidak boleh hitung objek ini sebagai bagian dari API Anda, karena sebenarnya tidak. Mereka sangat spesifik untuk aplikasi konsumen dan beberapa aplikasi yang menggunakan API Anda mungkin sebenarnya tidak perlu membuat objek ini dan dapat bertahan hidup hanya pada objek transfer data Anda. Misalnya, jika Anda tidak memerlukan validasi, Anda tidak perlu lapisan tambahan objek yang benar-benar identik dengan objek transfer data Anda.
Bagi saya, sepertinya masing-masing dari tiga tipe objek memetakan dengan sangat baik untuk satu tanggung jawab yang bersih coding dan praktik yang baik. Sayangnya, kode bersih dan praktik yang baik kadang-kadang berarti Anda menulis banyak kode tambahan dan melompati lingkaran tambahan "hanya karena". Dan ketika melakukan pengkodean, mungkin sulit untuk menghargai nilai yang diberikan ini kepada Anda - tetapi begitu Anda merilis aplikasi Anda dan mulai mendukungnya atau menambahkan fitur baru untuk versi berikutnya maka Anda mungkin akan mulai menghargai bahwa Anda meluangkan waktu untuk pisahkan masalah ini dengan benar sejak awal. (Belum lagi Anda
Saya juga benci menulis kode konversi antara berbagai jenis objek seperti ini, tetapi solusi saya biasanya salah satu dari yang berikut:
sumber