2008-10-13 2 views
8

값 목록 (정수, 사용자 정의 클래스 등)을 노출하는 웹 서비스를 구현해야합니다. 제 작업 솔루션은 List<T>을 반환하고 FxCop에 따르면 Collection<T> 또는 ReadOnlyCollection<T>을 반환하는 것이 좋습니다. 나는 ReadOnlyCollection<T>를 반환하도록 선택하는 경우목록 <T>을 사용하고 콜렉션을 노출하는 가장 좋은 방법은 <T>

는 웹 서비스가 오류처럼 보여줍니다

는 XML 직렬화하기 위해, ICollection에서 상속 유형은 상속 계층 구조의 모든 수준에서 Add(System.Int32)가 구현되어 있어야합니다. System.Collections.ObjectModel.ReadOnlyCollection1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]Add(System.Int32)을 구현하지 않습니다.

내부적으로 List<T>을 사용하고 Collection<T>을 노출하는 가장 좋은 방법은 무엇입니까? (C#을 사용하고 프레임 워크 2.0 만 가능)

답변

14

목록 <T> 또는 모음 <T>이 좋습니다.

원래의 질문의 관점에서

, 당신은 컬렉션 매우 간단 <T>의 목록 <T>을 포장 할 수 있습니다

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

이 진정한 래퍼입니다; 래퍼 (col)에 항목을 추가하면 목록에 추가됩니다. 대부분의 생성자가 인수를 사용하여 초기 채우기를 수행하지만 원래 목록에는 연결하지 않기 때문에 약간 혼란 스러울 수 있습니다. 모음 <T>은 예외입니다 .-p

웹 서비스 경계에 있으므로 FxCop의 권장 사항이 적용되지 않습니다. 호출자가 수신자의 메모리를 밟지 못하게하는 것이 유용하지만 (Eric Lippert's recent blog과 함께 사용하는 것), 단순히 적용되지 않는 웹 서비스 배포 시나리오에서 유용합니다. 사실, 웹 서비스는 특정 일반 시나리오에 대해 잘 문서화 된 문제가 있으므로 간단한 배열은 틀림없이 웹 서비스 경계에서 매우 유용하고 실용적입니다. Eric의 블로그의 맥락에서이 경우 호출자/수신자 문제에 대해서는 의문의 여지가 없습니다. 두 사람 사이에 장벽이 존재하기 때문입니다.

WSDL/mex에 관해서는 3 가지 (목록/컬렉션/배열)가 단지 요소 블록이 될 것이라고 생각합니다. 따라서 어느 것이 가장 편리한 곳인지 잘 알 수 있습니다.

+0

답변을 주셔서 감사합니다. 컬렉션에 대한 자세한 내용은 진정한 래퍼 역할을하기 전에 이전에 아무 것도 발견하지 못했습니다. – alexandrul

1

나는 일반적으로 IList <T>을 WCF 웹 서비스에서 반환합니다. FxCop은 이것으로 충분히 만족합니다. ASMX 웹 서비스에서 작동하는지 확실하지 않습니다.

+0

ASMX 웹 서비스는 직렬화하지 않으며 런타임 예외를 제공합니다. –

관련 문제