Xác nhận nên được thực hiện càng sớm càng tốt.
Xác thực trong bất kỳ ngữ cảnh nào, mô hình Miền hoặc bất kỳ cách viết phần mềm nào khác, sẽ phục vụ mục đích GÌ bạn muốn xác thực và bạn đang ở cấp độ nào vào lúc này.
Dựa trên câu hỏi của bạn, tôi đoán câu trả lời sẽ là phân chia xác nhận.
Xác thực thuộc tính kiểm tra xem giá trị của thuộc tính đó có đúng không, ví dụ: khi phạm vi từ 1-10 được thực hiện.
Xác thực đối tượng đảm bảo rằng tất cả các thuộc tính trên đối tượng là hợp lệ với nhau. ví dụ: BeginDate trước EndDate. Giả sử bạn đọc một giá trị từ kho lưu trữ dữ liệu và cả BeginDate và EndDate đều được khởi tạo thành DateTime.Min theo mặc định. Khi đặt BeginDate, không có lý do gì để thực thi quy tắc "phải trước EndDate", vì điều này không áp dụng YET. Quy tắc này phải được kiểm tra SAU tất cả các thuộc tính đã được đặt. Điều này có thể được gọi ở cấp gốc tổng hợp
Xác nhận cũng nên được xác định trước trên thực thể tổng hợp (hoặc gốc tổng hợp). Một đối tượng Order có thể chứa dữ liệu hợp lệ và OrderLines cũng vậy. Nhưng sau đó, một quy tắc kinh doanh nói rằng không có đơn hàng nào có thể vượt quá $ 1.000. Làm thế nào bạn sẽ thực thi quy tắc này trong một số trường hợp IS này được cho phép. bạn không thể chỉ thêm một tài sản "không xác thực số tiền" vì điều này sẽ dẫn đến lạm dụng (sớm hay muộn, thậm chí là bạn, chỉ để loại bỏ "yêu cầu khó chịu" này).
tiếp theo là xác nhận ở lớp trình bày. Bạn có thực sự sẽ gửi đối tượng qua mạng, biết rằng nó sẽ thất bại? Hoặc bạn sẽ tha cho người dùng burdon này và thông báo cho anh ta ngay khi anh ta nhập một giá trị không hợp lệ. ví dụ, hầu hết các lần môi trường DEV của bạn sẽ chậm hơn so với sản xuất. Bạn có muốn đợi 30 giây trước khi bạn được thông báo về "bạn đã quên trường này MỘT LẦN trong khi chạy thử KHÁC", đặc biệt là khi có một lỗi sản xuất được khắc phục khi sếp của bạn thở dốc?
Xác nhận ở mức độ bền vững được cho là càng gần với xác thực giá trị tài sản càng tốt. Điều này sẽ giúp ngăn các trường hợp ngoại lệ với việc đọc lỗi "null" hoặc "giá trị không hợp lệ" khi sử dụng trình ánh xạ của bất kỳ loại trình đọc dữ liệu cũ hoặc đơn giản nào. Sử dụng các thủ tục được lưu trữ sẽ giải quyết vấn đề này, nhưng yêu cầu phải viết logic định giá tương tự LẠI và thực hiện nó LẠI. Và các thủ tục được lưu trữ là miền quản trị DB, vì vậy đừng cố gắng thực hiện công việc NGÀI (hoặc tệ hơn là làm phiền anh ta với "việc chọn nitty mà anh ta không được trả tiền".
Vì vậy, để nói với nó với một số từ nổi tiếng "nó phụ thuộc", nhưng ít nhất bây giờ bạn biết TẠI SAO nó phụ thuộc.
Tôi ước tôi có thể đặt tất cả những thứ này ở một nơi duy nhất, nhưng thật không may, điều này không thể được thực hiện. Làm điều này sẽ đặt một sự phụ thuộc vào một "đối tượng của Chúa" chứa TẤT CẢ xác nhận cho TẤT CẢ các lớp. Bạn không muốn đi vào con đường tối đó.
Vì lý do này, tôi chỉ ném ngoại lệ xác nhận một cấp độ tài sản. Tất cả các cấp độ khác tôi sử dụng ValidationResult với phương thức IsValid để thu thập tất cả "quy tắc bị hỏng" và chuyển chúng cho người dùng trong một AggregateException duy nhất.
Khi tuyên truyền ngăn xếp cuộc gọi, sau đó tôi thu thập lại chúng trong AggregateExceptions cho đến khi tôi đến lớp trình bày. Lớp dịch vụ có thể ném ngoại lệ này thẳng đến máy khách trong trường hợp WCF là FaultException.
Điều này cho phép tôi lấy ngoại lệ và tách nó ra để hiển thị các lỗi riêng lẻ ở mỗi điều khiển đầu vào hoặc làm phẳng nó và hiển thị nó trong một danh sách. Sự lựa chọn là của bạn.
đây là lý do tại sao tôi cũng đề cập đến việc xác nhận bản trình bày, để ngắn mạch những điều này càng nhiều càng tốt.
Trong trường hợp bạn đang tự hỏi tại sao tôi cũng có xác nhận ở cấp độ tổng hợp (hoặc cấp độ dịch vụ nếu bạn muốn), thì đó là vì tôi không có quả cầu pha lê cho tôi biết ai sẽ sử dụng dịch vụ của tôi trong tương lai. Bạn sẽ có đủ khó khăn để tìm ra lỗi sai của mình để ngăn người khác mắc lỗi :) bằng cách nhập dữ liệu không hợp lệ. Bạn quản lý ứng dụng A, nhưng ứng dụng B cung cấp một số dữ liệu bằng dịch vụ của bạn. Đoán xem họ hỏi ai đầu tiên khi có lỗi? Quản trị viên của ứng dụng B sẽ vui vẻ thông báo cho người dùng "không có lỗi ở cuối, tôi chỉ cung cấp dữ liệu".