2015-06-09 14 views
18

tôi có một hệ thống các lớp dữ liệuC# FluentValidation cho một hệ thống các lớp

public class Base 
{ 
    // Fields to be validated 
} 

public class Derived1 : Base 
{ 
    // More fields to be validated 
} 

public class Derived2 : Base 
{ 
    // More fields to be validated 
} 

Điều gì sẽ là cách thích hợp để xác nhận Derived1 và Derived2 sử dụng khuôn khổ FluentValidation mà không trùng lặp quy tắc cho các lĩnh vực của lớp cơ sở?

Trả lời

24

Một cách tiếp cận để có sẽ như sau:

public class Base 
{ 
    public string BaseName { get; set; } 
} 

public class Derived1 : Base 
{ 
    public string Derived1Name { get; set; } 
} 

public class BaseValidator<T> : AbstractValidator<T> where T : Base 
{ 
    public BaseValidator() 
    { 
     RuleFor(b => b.BaseName).NotNull(); 
    } 
} 

public class Derived1Validator : BaseValidator<Derived1> 
{ 
    public Derived1Validator() 
    { 
     RuleFor(d => d.Derived1Name).NotNull(); 
    } 
} 

Vì vậy, trước tiên bạn tạo validator cơ sở của bạn, làm cho nó chấp nhận một đối số kiểu chung chung và chỉ ra rằng các loại generic phải loại base. Thiết lập các quy tắc chung cho lớp cơ sở của bạn và tiếp tục.

Đối với bất kỳ trình xác thực nào hợp lệ hóa con của lớp cơ sở của bạn, bạn có những trình xác thực này kế thừa từ baseValidator, trong đó T sẽ là loại lớp dẫn xuất của bạn.

+1

Cảm ơn câu trả lời! –

+0

Hoàn hảo! Làm việc như một say mê! Nhận thấy rằng không cần phải thêm: base() sau hàm tạo có nguồn gốc. Ban đầu, tôi đã có mặc dù nó sẽ không nhận các bài kiểm tra cơ sở mà không gọi một cách rõ ràng các nhà xây dựng cơ bản. Nhưng nó! –

+0

Bạn không cần phải thêm cơ sở() nếu bạn không có nhà thầu, bởi vì nó tự động ở đó. Nếu bạn có các hàm tạo khác, ngoài giá trị mặc định rỗng, thì bạn phải sử dụng dấu cơ sở() bằng chữ ký bạn cần. Trên các lớp xác nhận .. có lẽ bạn sẽ không bao giờ cần phải thêm bất kỳ nhà xây dựng khác nhau khác. – ppumkin

22
public class Derived2Validator : AbstractValidator<Derived2> 
{ 
    public Derived2Validator() 
    { 
     Include(new BaseValidator()); 
     Include(new Derived2Validator()); 
     RuleFor(d => d.Derived1Name).NotNull(); 
    } 
} 

Derived2Validator không cần phải kế thừa BaseValidator hoặc Derived1Validator. Phương thức Include sẽ bao gồm các quy tắc từ trình xác thực cơ sở.

+10

Tôi muốn sử dụng phương pháp này vì nó ưu tiên thành phần trên thừa kế là quy tắc vàng cho các nhà phát triển tốt –

Các vấn đề liên quan