ฉันสงสัยว่าอะไรคือวิธีที่ดีที่สุดในการตรวจสอบข้อ จำกัด ของฐานข้อมูล (เช่น UNIQUE) ในแอปพลิเคชัน ASP.NET MVC สร้างโดยคำนึงถึง DDD โดยที่เลเยอร์พื้นฐานคือ Application Layer (บริการแอปพลิเคชัน), Domain Layer (โมเดลโดเมน) และเลเยอร์โครงสร้างพื้นฐาน (ตรรกะการคงอยู่ การบันทึก ฯลฯ)
ฉันได้ดูตัวอย่าง DDD มากมาย แต่สิ่งที่หลายตัวอย่างไม่ได้กล่าวถึงคือวิธีการตรวจสอบความถูกต้องในพื้นที่เก็บข้อมูล (ฉันคิดว่านี่คือจุดที่การตรวจสอบความถูกต้องประเภทนี้เหมาะสม) หากคุณทราบตัวอย่างใด ๆ ที่ทำสิ่งนี้ กรุณาแบ่งปัน มันจะเป็นพระคุณมาก
เฉพาะเจาะจงมากขึ้น ฉันมีคำถามสองข้อ คุณจะดำเนินการตรวจสอบจริงอย่างไร คุณจะตรวจสอบอย่างชัดเจนว่ามีชื่อลูกค้าอยู่แล้วโดยการสอบถามฐานข้อมูลหรือไม่ หรือคุณจะลองแทรกชื่อนั้นลงในฐานข้อมูลโดยตรงและตรวจพบข้อผิดพลาดหากมี (ดูยุ่งเหยิง) ? ฉันชอบอันแรกมากกว่า และหากเลือกสิ่งนี้ ควรทำใน Repository หรือควรเป็นงานของ Application Service?
เมื่อตรวจพบข้อผิดพลาด คุณจะส่งต่อข้อผิดพลาดดังกล่าวไปยัง ASP.NET MVC อย่างไร เพื่อให้ผู้ใช้ได้รับแจ้งอย่างดีเกี่ยวกับข้อผิดพลาด ควรใช้ ModelStateDictionary
เพื่อให้สามารถเน้นข้อผิดพลาดบนแบบฟอร์มได้อย่างง่ายดาย
ในแอป N-Lyered โดย Microsoft Spain พวกเขาใช้อินเทอร์เฟซ IValidatableObject
และการตรวจสอบคุณสมบัติที่ง่ายที่สุดจะถูกวางไว้บนเอนทิตีเอง เช่น:
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;
}
ก่อนที่เอนทิตีจะยังคงอยู่ ข้อความตรวจสอบความถูกต้องจะถูกเรียกเพื่อให้แน่ใจว่าคุณสมบัตินั้นถูกต้อง:
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 ในแอปพลิเคชัน MVC และข้อความแสดงข้อผิดพลาดในการตรวจสอบความถูกต้องสามารถแยกวิเคราะห์และแทรกลงใน ModelStateDictionary
ได้
ฉันสามารถเพิ่มตรรกะการตรวจสอบทั้งหมดลงในเมธอด SaveCustomer ได้ เช่น การสืบค้นฐานข้อมูลตรวจสอบว่ามีลูกค้าอยู่แล้วโดยใช้คอลัมน์ที่กำหนด (อันที่ไม่ซ้ำ) อาจจะไม่เป็นไร แต่ฉันอยากให้ validator.IsValid
(หรืออะไรที่คล้ายกัน) ทำสิ่งนี้ให้ฉัน หรือการตรวจสอบความถูกต้องจะดำเนินการอีกครั้งในเลเยอร์โครงสร้างพื้นฐาน (หากเป็นของที่นี่ ฉันไม่แน่ใจ)
คุณคิดอย่างไร? คุณจะทำอย่างไรมันได้หรือไม่? ฉันสนใจที่จะรับข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับเทคนิคการตรวจสอบความถูกต้องต่างๆ ในแอปพลิเคชันแบบเลเยอร์
วิธีแก้ปัญหาที่เป็นไปได้ #1
ในกรณีที่ตรรกะการตรวจสอบความถูกต้องไม่สามารถทำได้ในเลเยอร์การนำเสนอ (เช่นที่ Iulian Margarintescu แนะนำ) และจำเป็นต้องดำเนินการในเลเยอร์บริการ คุณจะส่งผ่านข้อผิดพลาดในการตรวจสอบความถูกต้องไปยังเลเยอร์การนำเสนอได้อย่างไร
Microsoft มีข้อเสนอแนะ ที่นี่ (ดูรายการ 5) คุณคิดอย่างไรเกี่ยวกับแนวทางดังกล่าว?