2014-12-03 28 views
6

Tôi đang sử dụng API Web ASP.Net và Khuôn khổ Thực thể Đầu tiên Mã và từ những gì tôi đã đọc, bạn thường nên hiển thị đối tượng DTO thay vì đối tượng thực thể trực tiếp trong các phương thức hành động của bạn (theo http://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part-5). Vì vậy, trong một trường hợp tôi đang làm việc trên, để tránh vấn đề "quá tải" như được mô tả trong liên kết ở trên, tôi đã tạo ra một đối tượng DTO với hầu như tất cả các thuộc tính giống như đối tượng mô hình. Tuy nhiên, điều tôi thắc mắc là tôi có cần sao chép tất cả các tập hợp các thuộc tính xác nhận tương tự (ví dụ. [Bắt buộc], [Phạm vi (N, M)], v.v. cho cả thuộc tính DTO và mô hình? (để tránh trùng lặp) nhưng bạn cần các thuộc tính xác thực trên DTO nếu bạn muốn tận dụng xác nhận ràng buộc (ví dụ: ModelState.IsValid) và trên mô hình chính nếu bạn muốn cơ sở dữ liệu của mình được tạo ra với các ràng buộc thích hợp ([Bắt buộc ] -> không phải là null, vv)Thuộc tính xác thực API Web ASP.Net trên DTO?

có không có cách nào tốt hơn

Ngoài ra, đang có một số thuộc tính mà Entity không sử dụng nhưng xác nhận ràng buộc mô hình không sử dụng Ví dụ, trong khi [Range (n? , m)] sẽ ảnh hưởng rõ ràng đến việc xác thực trên một số đầu vào của khách hàng, thực thể có quan tâm đến nó không (nó dường như không ảnh hưởng đến DB được tạo ra lược đồ từ những gì tôi có thể biết?)

Trả lời

6

Các thực thể chỉ nên có các thuộc tính thực sự có tác động đến cơ sở dữ liệu. Các DTO không nên có bất kỳ thuộc tính nào để xác thực trừ DataMemberAttribute để xác định xem thuộc tính có bắt buộc hay không và thứ tự nào cần được hiển thị vv Đối với OData, bạn cũng phải đặt KeyAttribute. Các mô hình phải có các thuộc tính xác thực. Bởi vì các DTO và các mô hình có lẽ gần như giống hệt nhau bạn tạo cho mỗi dto cần được xác nhận một mô hình và chỉ trao đổi giá trị của dto cho đối tượng của mô hình. Bây giờ bạn có thể xác nhận nó, nếu bạn không sử dụng ValidationAttributes cho các mô hình bạn có thể xác nhận họ ví dụ với FluentValidation

câu chuyện Vì vậy, dài ngắn:

  • Đối tượng chỉ nhận được các thuộc tính mà thực sự ảnh hưởng đến giản đồ của cơ sở dữ liệu

  • DTOs là những đối tượng đơn giản không có logic xác nhận, trừ trường DataMemberAttribute

  • Models cần phải có xác nhận thuộc tính (onl y nếu cần thiết, không cần thiết khi sử dụng FluentValidation)

Các quy trình làm việc cho POST sẽ là: -> DTO do thỏa thuận -> Swap dto Model -> Xác nhận mô hình -> Hoán đổi mô hình để tổ chức -> Store thực thể trong cơ sở dữ liệu -> Sử dụng các thực thể cập nhật và trao đổi nó vào một dto mới -> Trả lại dto

Greetings, Voltaic

+4

"Swap dto để dựng mô hình" sau đó Validate mô hình, làm thế nào sẽ làm việc đó? Với swap tôi đoán bạn có nghĩa là bản đồ dto để mô hình? Nếu có, ModelState sẽ vẫn hoạt động trên dto bởi vì điều này được thông qua. Truyện ngắn: Bạn có đặt thuộc tính Bắt buộc trên DTO của bạn không? – Elisabeth

+0

Bạn có thể ánh xạ DTO để tạo mô hình bằng cách sử dụng AutoMapper hoặc bất kỳ khung công tác nào khác hoặc đơn giản là làm điều đó bằng tay. Thuộc tính Bắt buộc được sử dụng để đảm bảo trạng thái của dto mà bạn sẵn sàng xử lý. Mô hình không cần thuộc tính bắt buộc, chỉ DTO. Bạn có thể viết một lớp cơ sở cho các mô hình của bạn nắm giữ DTO như một loại trạng thái và sau đó bạn có thể chỉ phơi bày các thuộc tính của DTO như là các đặc tính của mô hình. – Voltaic

+0

Nếu đó là trường hợp, thì chiến lược chuyển thông tin về mô hình cơ bản cho khách hàng là gì? Nếu một trường là không hợp lệ, nó sẽ được tốt đẹp để biết mà không cần nhấn máy chủ. Tôi sẽ lập luận rằng nếu dto được sử dụng trong một hoạt động cập nhật sau đó đặt xác nhận hoặc logic kinh doanh khác trong dto để khách hàng có thể biết trước cách tạo yêu cầu. – Watson

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