IValidatableObject vs Single Responsibility


12

ฉันชอบจุดที่เพิ่มความสามารถของ MVC ช่วยให้มุมมองแบบจำลองใช้ IValidatableObject และเพิ่มการตรวจสอบความถูกต้องที่กำหนดเอง

ฉันพยายามควบคุมให้ตัวควบคุมของฉันคงอยู่เพราะการใช้รหัสนี้เป็นเพียงตรรกะการตรวจสอบเท่านั้น:

if (!ModelState.IsValid)
    return View(loginViewModel);

ตัวอย่างเช่นโมเดลมุมมองล็อกอินใช้ IValidatableObject รับวัตถุ ILoginValidator ผ่านการสร้างคอนสตรัค:

public interface ILoginValidator
{
    bool UserExists(string email);
    bool IsLoginValid(string userName, string password);
}

ดูเหมือนว่า Ninject การฉีดอินสแตนซ์ในมุมมองแบบจำลองไม่ใช่วิธีปฏิบัติทั่วไปจริง ๆ อาจเป็นรูปแบบการต่อต้านหรือไม่

นี่เป็นวิธีที่ดีหรือไม่? มีดีกว่าไหม


หากคุณต้องการการตรวจสอบความถูกต้องในวัตถุแยกต่างหากลองใช้ FluentValidation ดูfluentvalidation.codeplex.com/wikipage?title=mvc
rmac

+1 ความคิดที่ดีในการฉีดคลาส Validator แยกต่างหากที่ช่วยแก้ปัญหาของฉันที่ฉันต้องเข้าถึงข้อมูลฐานข้อมูลเพื่อการตรวจสอบ!
magnattic

คำตอบ:


7

โดยส่วนตัวแล้วการออกแบบของคุณดูสะอาดตา

IValidatableObject หมายถึงรูปแบบมุมมองที่จะช่วยให้การตรวจสอบบางอย่างที่ไม่สามารถให้บริการโดยคุณลักษณะง่าย - ฉีดตรวจสอบจริงซึ่งจะเรียก / บริการฐานข้อมูล / สิ่งที่ช่วยให้การออกแบบของคุณสะอาดและช่วยให้คุณไม่ละเมิดหลักการรับผิดชอบเดียว - ดูรุ่น รับผิดชอบโดยพื้นฐานแล้วสำหรับการถ่ายโอนข้อมูลและตรวจสอบความถูกต้องของข้อมูลที่ถ่ายโอน (ไม่ว่าจะผ่านแอตทริบิวต์หรือ IValidatableObject หรือทั้งสองอย่าง)


4

การมีวัตถุเฉพาะสำหรับการตรวจสอบรับรองว่าคุณเคารพ SRP แน่นอน - ซึ่งเป็นกรณีต่อไปเนื่องจากเป็นความรับผิดชอบทั่วไปของตัวแบบมุมมองเพื่อตรวจสอบความถูกต้องของข้อมูล

สำหรับการฉีดอินสแตนซ์เข้ากับโมเดลการดูฉันไม่สามารถเห็นอะไรผิดปกติได้ แทบไม่มีขีด จำกัด ของสิ่งที่สามารถฉีดเข้าไปในอะไร


3

แทนที่จะฉีด ILoginValidator ลงในตัวสร้าง VM ของคุณคุณสามารถใช้ ValidationContext (ซึ่งเป็นอาร์กิวเมนต์ของ IValidatableObject.Validate ()) เพื่อรับเครื่องมือตรวจสอบของคุณ

public IEnumerable<ValidationResult> Validate(ValidationContext vc)
{

var loginValidator = (ILoginValidator)vc.GetService(typeof(ILoginValidator));
return loginValidator.Validate();

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.