2010-09-19 30 views
9

Mỗi khi tôi bắt đầu làm việc trên một ứng dụng web ASP.NET MVC mới, tôi không chắc liệu có sử dụng xác thực DataAnnotations hay không. Một cái gì đó về nó cảm thấy sai.Chú thích dữ liệu hoặc xác thực thủ công trong các dịch vụ?

Ví dụ: giả sử tôi có một số UserService được chuyển một số CreateUserModel từ hành động Create của AccountController. Để đảm bảo người dùng luôn cung cấp tên, tôi đặt thuộc tính Name của mô hình để có thuộc tính [Required]. Bây giờ tôi đã an toàn trong kiến ​​thức rằng người liên kết mô hình sẽ không bao giờ cho tôi một số CreateUserModel trừ khi nó có tên.

Vấn đề của tôi là vì thành phần có thể sử dụng lại của hệ thống của tôi, nó không thể dựa vào thực tế lớp trên cung cấp dữ liệu hợp lệ, và chắc chắn cũng phải xác thực dữ liệu này. Sự cần thiết cho điều này được nhấn mạnh hơn nữa khi bạn xem xét rằng bạn có thể muốn viết một dịch vụ web hoàn toàn sử dụng lại UserService (và sẽ không có chất kết dính mô hình để thực hiện tất cả xác nhận chú thích dữ liệu cho nó).

Vì vậy, câu hỏi của tôi là: Thực tiễn tốt nhất cho tình huống này là gì? Xác nhận với chú thích dữ liệu và lặp lại xác nhận đó trong các dịch vụ? Chỉ xác thực trong các dịch vụ và ném ngoại lệ? Một sự kết hợp của cả hai?

Tôi hy vọng câu hỏi của mình không quá chủ quan, tôi chủ yếu cố gắng thiết lập một sự nhất trí về việc liệu việc chuyển xác thực sang chú thích dữ liệu có dẫn đến kết thúc tôi không.

Trả lời

1

Bạn nói đúng, bạn nên tắt xác thực trên bộ điều khiển và xác thực trong lớp dịch vụ. Bạn vẫn có thể sử dụng DataAnnotations nếu bạn muốn. Lớp dịch vụ có thể ném một ngoại lệ với các thông báo xác nhận, bộ điều khiển có thể bắt ngoại lệ đó và thêm các thông báo xác nhận vào ModelState. Bạn có thể tránh làm điều đó cho mỗi hành động bằng cách xử lý ngoại lệ xác thực trên phương thức OnException của bộ điều khiển.

1

Tôi sẽ không quan tâm rằng mọi thứ được xác thực hai lần, miễn là logic được xác định ở một nơi duy nhất, rõ ràng là trường hợp trong hoàn cảnh của bạn. Tôi không đủ kinh nghiệm để nói nhiều về MVC, nhưng tôi có thể tưởng tượng rằng việc ném ngoại lệ từ lớp dịch vụ sẽ không cung cấp trải nghiệm người dùng (UX) tốt như những gì MVC có thể cung cấp cho bạn khi xác thực (có thể Ví dụ hiển thị thông báo lỗi bên cạnh hộp văn bản không hợp lệ. Sẽ khó hơn nhiều khi thực hiện việc ném ngoại lệ từ lớp dịch vụ của bạn). Khi UX giống nhau, chỉ thực hiện xác thực của bạn trong dịch vụ, nếu không, hãy thực hiện nó trong cả hai lớp.

6

Tôi thực hiện tất cả xác thực của mình trong lớp dịch vụ, sử dụng kết hợp xác thực thủ công (nếu x == y) và sử dụng Chú thích dữ liệu.

Để sử dụng Chú thích dữ liệu trong lớp dịch vụ của bạn, bạn phải sử dụng thủ công lớp Validator bằng phương pháp TryValidateObject(). Một ví dụ tốt về điều này có thể được nhìn thấy here.

Sau đó, bạn phải chuyển lỗi xác thực xuống từ lớp dịch vụ của mình cho bộ điều khiển và yêu cầu trình điều khiển thêm từng lỗi vào danh sách lỗi Trạng thái mô hình.

+1

Đây là những gì chúng tôi làm trừ khi chúng tôi chuyển IValidationDictionary sang lớp sevice được triển khai như trình bao bọc ModelState để lớp dịch vụ có thể thêm lỗi vào ModelState trực tiếp nhưng không phụ thuộc vào ASP.NET MVC. Bộ điều khiển sau đó không cần phải lo lắng về việc quản lý việc thêm các lỗi trả về cho ModelState. –

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