tôi có, chúng ta hãy nói, lớp này rất đơn giản:Validation sử dụng thuộc tính
public class User
{
[Required(AllowEmptyStrings = false, ErrorMessage="EmailIsRequired"]
public string EmailAddress { get; set; }
}
tôi biết làm thế nào để sử dụng Validator.TryValidateProperty và Validator.TryValidateObject trong không gian tên System.ComponentModel.DataAnnotations. Để làm việc này, bạn cần một thể hiện thực sự của đối tượng mà bạn muốn xác nhận hợp lệ.
Nhưng bây giờ, tôi muốn xác nhận một giá trị nhất định mà không có một thể hiện của lớp tài, như:
TryValidateValue(typeof(User), "EmailAddress", "[email protected]");
Mục tiêu là tôi muốn kiểm tra một giá trị trước khi thực sự cần phải nhanh chóng các đối tượng chính nó (lý do là tôi chỉ cho phép các thực thể miền hợp lệ được tạo). Vì vậy, trên thực tế, tôi muốn sử dụng các thuộc tính xác nhận trên các lớp thay vì các cá thể.
Bất kỳ ý tưởng nào có thể thực hiện được?
Cảm ơn!
EDIT: trong khi đó, tôi quyết định không sử dụng chú thích dữ liệu, nhưng thay vào đó hãy sử dụng http://fluentvalidation.codeplex.com để xác thực được di chuyển ra ngoài các thực thể. Cách xác thực này có thể được kích hoạt từ bên trong các thực thể cũng như các trình xử lý lệnh của tôi. Bản thân xác nhận cũng dễ đọc hơn, nhờ ký hiệu thông thạo.
Bạn nói rằng bạn đang cố gắng để tránh instantiating đối tượng tên miền nếu họ không hợp lệ, nhưng tác động của instantiating nó là gì? Có thể là đối tượng của bạn đang làm quá nhiều thứ, và bạn nên chia nhỏ trách nhiệm của nó nếu chỉ đơn giản gọi là constructor sẽ làm rối tung mọi thứ. –
Thực thể miền đang kiểm tra tất cả các trường trong hàm tạo của nó, nếu bất kỳ trường nào trong số đó không xác thực, một ngoại lệ được ném ra, do đó đối tượng không thể được tạo. Nhưng bây giờ, trong trình xử lý lệnh của tôi, để xác thực theo ngữ cảnh, tôi cần xác nhận địa chỉ email, nhưng tôi không cần chính đối tượng đó. Vì vậy, tôi đã tự hỏi: tại sao tôi không thể tái sử dụng xác nhận email này mà không cần một thể hiện của đối tượng này. Tôi cũng có thể loại bỏ xác nhận hoàn toàn ra khỏi thực thể, nhưng sau đó tôi không thể sử dụng chú thích dữ liệu tôi đoán ... –
Có cách nào để tạo chú thích có nguồn gốc tùy chỉnh không? Sau đó bạn có thể chia sẻ việc thực hiện xác nhận hợp lệ giữa chú thích và cho trình xử lý lệnh này. Đó có thể là hack, nhưng cá nhân tôi tin rằng chú thích không phải là giải pháp kiến trúc hoàn chỉnh hoặc hoàn toàn yếu tố để xác thực ràng buộc miền (họ không thể xử lý ràng buộc thuộc tính chéo và nếu được áp dụng cho lớp, không hỗ trợ logic), vì vậy bạn chỉ làm tốt nhất với những gì bạn có. –