2016-07-31 3 views
0

WCF 응용 프로그램에서 인터페이스와 여러 클래스를 만들고 싶습니다. 예 : 인터페이스 ITable. 클래스 고객 : ITable 및 직원 : WCF generic 형식 반환

이 후 ITable

생성하기 위해 가능하면 ...
[OperationContract] 
IEnumerable<T> GetTable<T>() where T: ITable, new(); 

... 내 서비스 인터페이스입니다.

나는 한 번 시험해 보았고 응용 프로그램은 야만적 인 사람이었습니다.

클라이언트 측에서 내 작업을 단순화하고 싶습니다. 내 ITable 목록을 얻으려면 Client.GetTable 또는 Client.GetTable을 사용하십시오.

답변

0

구체적인 유형을 지정하지 않았기 때문에 클라이언트가 ITable을 구현하지만 서비스에는 알 수없는 유형의 서비스를 호출 할 수 있습니다. 클라이언트 측에서는 클래스가 제네릭 제약 조건에 맞기 때문에 작동하는 것처럼 보이지만 서비스는이를 deserialize 할 수 없습니다.

이 같은 서비스에 하나 개 이상의 ServiceKnownType 속성을 추가 할 수 있습니다

[ServiceKnownType(typeof(SomeTable))] 
[ServiceKnownType(typeof(SomeOtherTable))] 
[ServiceContract] 
public interface IYourService 
{ 
    [OperationContract] 
    IEnumerable<T> GetTable<T>() where T: ITable, new(); 
} 

그 방법은 서비스 콘크리트 종류 나 유형으로 역 직렬화하는 것을 알고있다.

+0

답변 해 주셔서 감사합니다. 추가 질문이 있습니다. ITable에는 어떤 속성이 필요합니까? –

+0

내가이 논리를 사용할 때마다이 예외가 발생합니다. ** 서비스를 시작할 수 없습니다. System.Runtime.Serialization.InvalidDataContractException : 형식 'System.Collections.Generic.IEnumerable'1 [T]'은 열려있는 제네릭 형식이므로 스키마 형식으로 내보낼 수 없습니다. 모든 제네릭 매개 변수 유형이 실제 유형인 경우에만 제네릭 유형을 내보낼 수 있습니다. at System.Runtime.Serialization.DataContractSet.EnsureTypeNotGeneric (유형 유형) at ... ** –

0

메서드 및 메서드를 선언하는 형식을 사용하는 ServiceKnownType 특성 오버로드를 사용할 수 있습니다. 메서드는 IEnumerable을 반환해야합니다.