IValiditableObject vs Trách nhiệm đơn


12

Tôi thích điểm mở rộng của MVC, cho phép các mô hình xem thực hiện IValiditableObject và thêm xác thực tùy chỉnh.

Tôi cố gắng giữ cho Bộ điều khiển của mình tinh gọn, có mã này là logic xác thực duy nhất:

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

Ví dụ, một mô hình khung nhìn đăng nhập thực hiện IValiditableObject, lấy đối tượng ILoginValidator thông qua phương thức tiêm constructor:

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

Có vẻ như Ninject, tiêm phiên bản trong các mô hình xem không thực sự là một thông lệ, thậm chí có thể là một mô hình chống?

Đây có phải là một cách tiếp cận tốt? Có một cái tốt hơn?


Nếu bạn muốn xác thực trong một đối tượng riêng biệt, hãy thử FluentValidation. Xem fluentvalidation.codeplex.com/wikipage?title=mvc .
rmac

+1 Ý tưởng tuyệt vời để tiêm một lớp Trình xác thực riêng biệt, giải quyết vấn đề của tôi khi tôi phải truy cập thông tin cơ sở dữ liệu để xác thực!
Magnattic

Câu trả lời:


7

Cá nhân, với tôi thiết kế của bạn có vẻ sạch sẽ.

IValiditableObject có nghĩa là mô hình khung nhìn sẽ cung cấp một số xác thực không thể được cung cấp bởi các thuộc tính đơn giản - tiêm trình xác nhận thực sẽ gọi dịch vụ / cơ sở dữ liệu / bất cứ điều gì giữ cho thiết kế của bạn sạch sẽ và đảm bảo bạn không vi phạm nguyên tắc trách nhiệm duy nhất - Xem mô hình về cơ bản, chịu trách nhiệm về việc truyền dữ liệu và xác thực dữ liệu được truyền (cho dù đó là thông qua các thuộc tính hoặc IValiditableObject hoặc cả hai).


4

Có một đối tượng chuyên dụng để xác thực đảm bảo rằng bạn tôn trọng SRP thực sự - dù sao đó cũng là trường hợp vì đây là trách nhiệm điển hình của mô hình xem để xác thực dữ liệu của nó.

Đối với việc đưa các cá thể vào các mô hình xem, tôi không thể thấy điều gì sai với điều đó. Hầu như không có giới hạn cho những gì có thể được tiêm vào những gì.


3

Thay vì tiêm ILoginValidator vào hàm tạo VM của bạn, bạn có thể sử dụng ValidationContext (là đối số của IValiditableObject.Validate ()) để lấy Trình xác thực của bạn.

public IEnumerable<ValidationResult> Validate(ValidationContext vc)
{

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

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.