Saya bertanya-tanya apa cara terbaik untuk melakukan validasi batasan basis data (misalnya UNIK) dalam aplikasi ASP.NET MVC, dibangun dengan mempertimbangkan DDD, dengan lapisan yang mendasarinya adalah Lapisan Aplikasi (layanan aplikasi), Lapisan Domain (model domain) dan Lapisan Infrastruktur (logika persistensi, logging, dll.).
Saya telah mencari banyak contoh DDD, tetapi yang tidak disebutkan oleh banyak dari mereka adalah bagaimana melakukan validasi dalam repositori (saya kira di sinilah jenis validasi ini cocok). Jika Anda mengetahui sampel yang melakukan hal ini, silakan bagikan, itu akan sangat dihargai.
Lebih spesifiknya, saya punya dua pertanyaan. Bagaimana Anda melakukan validasi sebenarnya? Apakah Anda akan memeriksa secara eksplisit apakah nama pelanggan sudah ada dengan menanyakan database, atau apakah Anda akan mencoba memasukkannya langsung ke database dan menemukan kesalahan jika ada (tampaknya berantakan) ? Saya lebih suka yang pertama, dan jika memilih ini, haruskah itu dilakukan di repositori, atau haruskah itu menjadi tugas layanan aplikasi?
Ketika kesalahan terdeteksi, bagaimana Anda meneruskannya ke ASP.NET MVC sehingga pengguna dapat diberitahu dengan baik tentang kesalahan tersebut? Lebih disukai menggunakan ModelStateDictionary
sehingga kesalahan mudah disorot pada formulir.
Di aplikasi N-Lyered oleh Microsoft Spanyol, mereka menggunakan antarmuka IValidatableObject
dan validasi properti paling sederhana ditempatkan pada entitas itu sendiri, seperti:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var validationResults = new List<ValidationResult>();
if (String.IsNullOrWhiteSpace(this.FirstName))
validationResults.Add(new ValidationResult(Messages.validation_CustomerFirstNameCannotBeNull, new string[] { "FirstName" }));
return validationResults;
}
Sebelum entitas dipertahankan, pesan Validasi dipanggil untuk memastikan bahwa propertinya valid:
void SaveCustomer(Customer customer)
{
var validator = EntityValidatorFactory.CreateValidator();
if (validator.IsValid(customer)) //if customer is valid
{
_customerRepository.Add(customer);
_customerRepository.UnitOfWork.Commit();
}
else
throw new ApplicationValidationErrorsException(validator.GetInvalidMessages<Customer>(customer));
}
ApplicationValidationErrorsException kemudian dapat ditangkap dalam aplikasi MVC dan pesan kesalahan validasi dapat diurai dan dimasukkan ke dalam ModelStateDictionary
.
Saya dapat menambahkan semua logika validasi ke dalam metode SaveCustomer, mis. menanyakan database memeriksa apakah pelanggan sudah ada menggunakan kolom tertentu (yang UNIK). Mungkin ini oke, tapi saya lebih suka validator.IsValid
(atau yang serupa) melakukan ini untuk saya, atau validasi dilakukan sekali lagi di lapisan Infrastruktur (jika termasuk di sini, saya tidak yakin).
Bagaimana menurutmu? Bagaimana Anda melakukannya? Saya sangat tertarik untuk mendapatkan lebih banyak wawasan tentang berbagai teknik validasi dalam aplikasi berlapis.
Kemungkinan solusi #1
Jika logika validasi tidak dapat dilakukan di lapisan presentasi (seperti yang disarankan Iulian Margarintescu) dan perlu dilakukan di lapisan layanan, bagaimana Anda meneruskan kesalahan validasi ke lapisan presentasi?
Microsoft memiliki saran di sini (lihat daftar 5). Apa pendapat Anda tentang pendekatan itu?