Ketika merencanakan arsitektur untuk aplikasi web MVC skala menengah-besar, bagaimana Anda mengimplementasikan layer agar dapat dipisahkan sebanyak mungkin dan mudah untuk diuji? (pada dasarnya ikuti praktik terbaik) Katakanlah saya menggunakan kode terlebih dahulu sebagai akses data saya.
Saya berjuang dengan apa yang mendefinisikan "logika bisnis" sebagai, dan bagaimana itu dimaksudkan untuk berinteraksi dengan lapisan data. Dengan mengambil aplikasi penjualan kendaraan sebagai contoh, akankah logika bisnis menjadi kelas yang melakukan tugas-tugas seperti menghitung pita pajak untuk kendaraan yang diberikan, membandingkan statistik statistik mile per galon dll? Adapun entitas bisnis (misalnya Mobil, Vans, Sepeda Motor) saya akan menempatkan ini di lapisan data bersama dengan DataContext
kelas saya .
Juga apa yang merupakan logika aplikasi yang bertentangan dengan bisnis - Saya menduga hal-hal seperti validasi input sesi / pengguna?
Jadi misalnya, pengontrol mobil mungkin mengembalikan hasil tindakan / tampilan yang mencantumkan sepuluh mobil teratas yang difilter menurut jenis dan mpg terbaik. Jadi katakanlah saya memiliki ICarRepository
'carRepo' yang disuntikkan ke controller saya (menggunakan pola repositori / DI), saya memfilter mobil saya dari parameter metode tindakan misalnyavar cars = carRepo.getCarsByType("hatchback");
Jadi saya telah menyimpan pengetahuan akses data dari controller saya menggunakan repositori, sekarang untuk menjaga logika bisnis dari controller menggunakan model domain - var result = new MpgCalculator (mobil); - Katakanlah saya memerlukan kelas kalkulator karena perlu melakukan logika tambahan untuk menghitung efisiensi bahan bakar terbaik, lebih dari sekedar memuat / menyaring entitas dari DB. Jadi sekarang saya memiliki set data untuk tampilan saya untuk membuat yang menggunakan repositori untuk mengambil dari lapisan akses data, dan objek khusus domain untuk memproses dan melakukan tugas-tugas terkait bisnis pada data itu.
Apakah saya membuat kesalahan di sini? apakah kita masih perlu menggunakan pola repositori atau bisakah saya hanya kode terhadap antarmuka untuk memisahkan ORM dan menguji? Pada topik ini, karena kelas akses data konkret saya (d) konteks di lapisan data, haruskah definisi antarmuka masuk ke domain / lapisan bisnis yang berarti bahwa jika teknologi akses data pernah diubah, lapisan saya yang lain tidak terpengaruh?
Dari apa yang telah saya pelajari sejauh ini struktur saya terlihat seperti ini:
Aplikasi Internet MVC -> Proyek internet standar - model di sini adalah ViewModels
Lapisan Domain / Bisnis -> kelas / model khusus bisnis yang dapat digunakan pengendali untuk memproses entitas domain dari lapisan data sebelum meneruskan ke tampilan yang relevan
Diperlukan abstraksi repositori? -> Saya mendengar banyak perdebatan tentang ini, terutama ketika menggunakan ORM
Lapisan data -> Kelas entitas (Mobil, Van, Sepeda Motor), DbContext - Lapisan teknologi akses data konkret