Kata pengantar
Semoga ini jelas, tetapi ... dalam ruang nama yang disarankan di bawah ini, Anda akan mengganti MyCompany
dan MyProject
dengan nama sebenarnya dari perusahaan dan proyek Anda.
DTO
Saya akan merekomendasikan menggunakan kelas DTO yang sama di semua lapisan. Lebih sedikit poin perawatan seperti itu. Saya biasanya menempatkan mereka di bawah MyCompany.MyProject.Models
namespace, dalam proyek VS mereka sendiri dengan nama yang sama. Dan saya biasanya memberi nama mereka hanya setelah entitas dunia nyata yang mereka wakili. (Idealnya, tabel database menggunakan nama yang sama juga, tetapi kadang-kadang masuk akal untuk mengatur skema sedikit berbeda di sana.)
Contoh: Person
, Address
,Product
Dependensi: Tidak ada (selain pustaka .NET atau helper)
DAL
Preferensi pribadi saya di sini adalah menggunakan satu-untuk-satu set kelas DAL yang cocok dengan kelas DTO, tetapi dalam MyCompany.MyProject.DataAccess
namespace / proyek. Nama kelas di sini diakhiri dengan Engine
sufiks untuk menghindari konflik. (Jika Anda tidak menyukai istilah itu, maka DataAccess
sufiks juga akan berfungsi dengan baik. Konsisten dengan apa pun yang Anda pilih.) Setiap kelas menyediakan opsi CRUD sederhana yang menyentuh database, menggunakan kelas DTO untuk sebagian besar parameter input dan mengembalikan tipe (di dalam generik List
ketika ada lebih dari satu, misalnya, pengembalian dari suatu Find()
metode).
Contoh: PersonEngine
, AddressEngine
,ProductEngine
Ketergantungan: MyCompany.MyProject.Models
BAL / BLL
Juga pemetaan satu-untuk-satu di sini, tetapi dalam MyCompany.MyProject.Logic
namespace / proyek, dan dengan kelas mendapatkan Logic
akhiran. Ini harus menjadi satu - satunya lapisan yang memanggil DAL! Kelas-kelas di sini sering kali hanya merupakan lulus sederhana ke DAL, tetapi jika & ketika aturan bisnis perlu diimplementasikan, ini adalah tempatnya.
Contoh: PersonLogic
, AddressLogic
,ProductLogic
Dependensi: MyCompany.MyProject.Models
,MyCompany.MyProject.DataAccess
API
Jika ada lapisan API layanan web, saya menggunakan pendekatan satu-untuk-satu, tetapi dalam MyCompany.MyProject.WebApi
namespace / proyek, dengan Services
sebagai akhiran kelas. (Kecuali jika Anda menggunakan ASP.NET Web API, dalam hal ini Anda tentu saja akan menggunakan Controller
akhiran sebagai gantinya).
Contoh: PersonServices
, AddressServices
,ProductServices
Dependensi: MyCompany.MyProject.Models
, MyCompany.MyProject.Logic
(tidak pernah memotong ini dengan memanggil DAL langsung!)
Pengamatan pada Logika Bisnis
Tampaknya menjadi semakin umum bagi orang untuk meninggalkan BAL / BLL, dan sebagai gantinya menerapkan logika bisnis di satu atau lebih lapisan lain, di mana pun hal itu paling masuk akal. Jika Anda melakukan ini, cukup yakinlah bahwa (1) semua kode aplikasi melewati lapisan dengan logika bisnis, dan (2) jelas dan / atau didokumentasikan dengan baik di mana setiap aturan bisnis tertentu telah diterapkan. Jika ragu, jangan coba ini di rumah.
Catatan Akhir tentang Arsitektur Tingkat Perusahaan
Jika Anda berada di perusahaan besar, atau situasi lain di mana tabel database yang sama dibagikan di beberapa aplikasi, maka saya akan merekomendasikan untuk tidak memasukkan MyProject
bagian dari ruang nama / proyek di atas. Dengan cara itu lapisan-lapisan itu dapat dibagi oleh beberapa aplikasi front-end (dan juga utilitas di belakang layar seperti Layanan Windows). Tetapi lakukan ini hanya jika Anda memiliki komunikasi lintas tim yang kuat dan pengujian kemunduran otomatis menyeluruh yang dilakukan !!! Jika tidak, perubahan satu tim ke komponen inti bersama cenderung merusak aplikasi tim lain.