2008-10-13 29 views
8

Tôi phải triển khai dịch vụ web hiển thị danh sách giá trị (số nguyên, lớp tùy chỉnh, v.v.). Giải pháp làm việc của tôi trả về một số List<T> và theo FxCop thì tốt hơn là trả lại Collection<T> hoặc ReadOnlyCollection<T>.Cách tốt nhất để sử dụng Danh sách <T> và hiển thị Bộ sưu tập <T>

Nếu tôi chọn để trả về ReadOnlyCollection<T>, dịch vụ web cho thấy một lỗi như:

Để có XML serializable, loại mà kế thừa từ ICollection phải có một thực hiện Add(System.Int32) ở tất cả các cấp của hệ thống phân cấp thừa kế của họ. System.Collections.ObjectModel.ReadOnlyCollection1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] không triển khai Add(System.Int32).

Cách yêu thích của bạn để sử dụng trong nội bộ List<T> và hiển thị một số Collection<T> là gì? (sử dụng C# và tốt nhất là khung 2.0 chỉ)

Trả lời

14

Danh sách <T> hoặc Bộ sưu tập <T> là tốt trong trường hợp này.

Về câu hỏi ban đầu, bạn có thể quấn một danh sách <T> trong một Bộ sưu tập <T> rất đơn giản:

List<Foo> list = new List<Foo>(); 
// ... 
Collection<Foo> col = new Collection<Foo>(list); 

Đây là một wrapper true; thêm một mục vào trình bao bọc (col) và nó được thêm vào danh sách. Điều này có thể hơi khó hiểu, bởi vì nhiều nhà xây dựng như vậy sử dụng đối số để làm dân số ban đầu, nhưng không liên kết đến danh sách ban đầu. Bộ sưu tập <T> là một ngoại lệ ;-p

Vì bạn đang ở trên ranh giới dịch vụ web, đề xuất đó từ FxCop không áp dụng. Điều đó rất hữu ích (nội tuyến với Eric Lippert's recent blog) để ngăn chặn người gọi dẫm lên bộ nhớ của callee - nhưng trong một kịch bản phân phối dịch vụ web mà chỉ đơn giản là không áp dụng. Trong thực tế, vì các dịch vụ web có một vài vấn đề được ghi chép rõ ràng với các kịch bản chung nhất định, một mảng đơn giản được cho là rất có ích và thực dụng tại một ranh giới dịch vụ web. Trong bối cảnh blog của Eric - trong trường hợp này, không có câu hỏi về vấn đề người gọi/callee, vì có một rào cản được thực thi giữa hai người.

Xét về WSDL/mex, tôi nghi ngờ tất cả 3 (danh sách/bộ sưu tập/mảng) sẽ trở thành một khối các phần tử - vì vậy bạn có thể thực hiện một cách thuận tiện nhất.

+0

Cảm ơn câu trả lời của bạn và để biết chi tiết về Bộ sưu tập hoạt động như một trình bao bọc thực sự, tôi không tìm thấy bất kỳ điều gì về nó trước đây. – alexandrul

1

Tôi thường trả lại IList <T> từ dịch vụ web WCF: FxCop đủ hài lòng với điều này. Không chắc chắn nếu điều này làm việc với các dịch vụ web ASMX.

+0

Dịch vụ web ASMX sẽ không tuần tự hóa (và sẽ cung cấp cho một ngoại lệ thời gian chạy) giao diện. –

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