Saya melakukan diskusi hangat hari ini tentang aplikasi MVC kami. Kami memiliki situs web yang ditulis dalam MVC ( ASP.NET ), dan biasanya mengikuti pola melakukan sesuatu dalam tampilan -> tekan controller -> controller membangun model (memanggil Manajer yang mendapatkan data, membangun model dalam metode controller itu sendiri) -> model pergi untuk melihat -> bilas & ulangi.
Dia mengatakan bahwa kode kita terlalu erat. Misalnya, jika kami menginginkan aplikasi desktop juga, kami tidak akan dapat menggunakan kode yang ada.
Solusi dan praktik terbaik yang dia katakan adalah membangun API, dan kemudian membangun situs web Anda di atas API Anda, dan kemudian membangun aplikasi desktop, aplikasi seluler, dll. Sangat sederhana.
Ini sepertinya ide yang buruk bagi saya karena berbagai alasan.
Pokoknya saya tidak dapat menemukan apa pun dengan googling yang mungkin membahas praktik ini. Apakah ada yang punya informasi tentang pro, kontra, mengapa Anda harus, mengapa Anda tidak harus atau membaca lebih lanjut?
Beberapa alasan saya pikir itu ide yang buruk:
Terlalu abstrak untuk menjalankan backend Anda dari API. Anda mencoba membuatnya terlalu fleksibel yang akan membuatnya berantakan.
Semua hal yang dibangun dalam MVC tampaknya tidak berguna, seperti peran dan otentikasi. Misalnya, atribut [Keamanan] dan keamanan; Anda harus menggulung sendiri.
Semua panggilan API Anda akan memerlukan informasi keamanan terlampir, dan Anda harus mengembangkan sistem token dan yang lainnya.
Anda harus menulis panggilan API lengkap untuk setiap fungsi yang akan dilakukan program Anda. Hampir setiap metode yang ingin Anda implementasikan harus dijalankan dari API. Dapatkan / Perbarui / Hapus untuk setiap pengguna, plus varian untuk setiap operasi lainnya, misalnya perbarui nama pengguna, tambahkan pengguna ke grup, dll. Dll. Dan masing-masing akan menjadi panggilan API yang berbeda.
Anda kehilangan semua jenis alat seperti antarmuka dan kelas abstrak ketika datang ke API. Hal-hal seperti WCF memiliki dukungan yang sangat lemah untuk antarmuka.
Anda memiliki metode yang menciptakan pengguna, atau melakukan beberapa tugas. Jika Anda ingin membuat 50 pengguna, Anda bisa menyebutnya 50 kali. Ketika Anda memutuskan untuk melakukan metode ini sebagai API, server web Anda dapat menamainya dengan pipa bernama dan tidak ada masalah - klien desktop Anda juga dapat melakukannya, tetapi tiba-tiba kreasi pengguna massal Anda akan melibatkan pemalu API melalui Internet 50 kali yang tidak bagus Jadi Anda harus membuat metode massal, tetapi sebenarnya Anda hanya membuatnya untuk klien desktop. Dengan cara ini, Anda pada akhirnya harus a) memodifikasi API Anda berdasarkan apa yang diintegrasikan dengannya, dan Anda tidak bisa langsung berintegrasi dengannya, b) melakukan lebih banyak pekerjaan untuk membuat fungsi tambahan.
YAGNI . Kecuali jika Anda secara khusus berencana untuk menulis dua aplikasi yang berfungsi identik, satu web dan satu aplikasi Windows misalnya, itu adalah sejumlah besar pekerjaan pengembangan tambahan.
Debugging jauh lebih sulit ketika Anda tidak dapat melangkah dari ujung ke ujung.
Banyak operasi independen yang akan membutuhkan banyak bolak-balik, misalnya beberapa kode mungkin mendapatkan pengguna saat ini, periksa pengguna di peran administrator, dapatkan perusahaan milik pengguna, dapatkan daftar anggota lain, kirim semua anggota email. Itu akan membutuhkan banyak panggilan API, atau menulis metode khusus tugas khusus yang Anda inginkan, di mana satu-satunya manfaat metode dipesan lebih dahulu adalah kecepatan, tetapi downside akan menjadi tidak fleksibel.
Mungkin beberapa alasan lagi ini hanya di luar kepala saya.
Sepertinya saya suka kecuali Anda benar-benar membutuhkan dua aplikasi yang identik, maka itu benar-benar tidak layak. Saya belum pernah melihat aplikasi ASP.NET yang dibangun seperti ini juga, Anda harus menulis dua aplikasi terpisah (API dan kode Anda) dan versi mengontrol keduanya juga (jika halaman pengguna Anda mendapatkan bidang baru, Anda harus Anda harus memperbarui API dan kode konsumsi Anda secara bersamaan untuk memastikan tidak ada efek buruk atau membuat banyak pekerjaan tambahan agar tetap kuat).
Sunting: Beberapa tanggapan hebat, benar-benar mulai mendapatkan ide bagus tentang apa artinya semua ini sekarang. Jadi untuk memperluas pertanyaan saya, bagaimana Anda menyusun aplikasi MVC untuk mengikuti struktur API ini?
Misalnya, Anda memiliki situs web yang menampilkan info tentang pengguna. Di bawah MVC, Anda memiliki:
Lihat - (CS) halaman HTML yang menampilkan Pengontrol UserViewModel - Memanggil GetUser () dan membuat UserViewModel yang diteruskan ke kelas Manajer tampilan (semacam API Anda) yang memiliki metode GetUser.
Pengontrol tidak GetUser () tetapi Anda ingin aplikasi desktop juga. Ini artinya GetUser Anda perlu diekspos melalui semacam API. Anda mungkin menginginkan koneksi TCP, baik WCF, atau mungkin Remoting. Anda juga menginginkan aplikasi seluler yang akan tenang karena koneksi yang terus-menerus tidak stabil.
Jadi, bisakah Anda menulis API untuk masing-masing, layanan web WCF yang memiliki metode GetUser () dan kodenya begitu return new UserManager().GetUser()
? Dan metode web api mvc 4 yang melakukan hal yang sama? Sambil terus memanggil GetUser secara langsung dalam metode pengontrol MVC Anda?
Atau apakah Anda memilih solusi yang akan bekerja untuk ketiganya (layanan web api REST) dan membangun semuanya berdasarkan itu, sehingga ketiga aplikasi melakukan panggilan API (yang mvc, ke mesin lokal).
Dan apakah ini hanya skenario teoretis yang sempurna? Saya dapat melihat overhead besar dalam mengembangkan cara ini, terutama jika Anda harus mengembangkan dengan cara yang akan memungkinkan Anda melakukan operasi dengan tenang. Saya pikir beberapa di antaranya telah tercakup dalam balasan.
Sunting 2: Setelah membaca lebih banyak hal, saya telah memberikan komentar di bawah ini yang saya pikir dapat menjelaskannya. Pertanyaannya adalah sedikit pertanyaan jebakan, saya pikir. Jika Anda menulis back-end Anda sebagai API membuat saya bingung berpikir harus ada satu layanan web yang semuanya (panggilan mvc, aplikasi desktop, aplikasi seluler) panggilan untuk melakukan hal-hal.
Kesimpulan yang saya dapatkan adalah bahwa apa yang harus Anda lakukan adalah memastikan bahwa lapisan logika bisnis Anda dipisahkan dengan benar. Melihat kode saya, saya sudah melakukan ini - controller akan memanggil GetUser()
manajer, lalu membuat model tampilan dari itu untuk membuat dengan Tampilan. Jadi sungguh, lapisan logika bisnis adalah API. Jika Anda ingin memanggilnya dari aplikasi desktop, Anda harus menulis sesuatu seperti layanan WCF untuk memudahkan memanggilnya. Bahkan hanya memiliki metode WCF yang disebut GetUser()
yang berisi kode return MyBusinessLayer.GetUser()
akan cukup. Jadi API adalah logika bisnis, dan WCF / web api dll hanyalah titlits kode untuk membiarkan aplikasi eksternal memanggilnya.
Jadi ada beberapa overhead, di mana Anda harus membungkus lapisan logika bisnis Anda dalam API yang berbeda tergantung pada apa yang Anda butuhkan, dan Anda harus menulis metode API untuk setiap operasi yang Anda ingin aplikasi lain lakukan, ditambah Anda harus memilah cara untuk melakukan otentikasi, tetapi sebagian besar sama. Tempelkan logika bisnis Anda di proyek yang terpisah (perpustakaan kelas), dan Anda mungkin tidak akan mengalami masalah!
Semoga interpretasi ini benar. Terima kasih atas semua diskusi / komentar yang telah dihasilkannya.