귀하의 예. IObject, IOne 및 ITwo로 정의하려는 것은 서비스 계약이 아닌 데이터 계약입니다. 따라서 인터페이스가 아닌 ServiceContract 특성 및 클래스가 아닌 DataContract 특성을 사용해야합니다.
[DataContract]
[KnownType(typeof(MyOne))]
[KnownType(typeof(MyTwo))]
public class MyObject
{
[DataMember]
Guid ObjectID;
}
[DataContract]
public class MyOne : MyObject
{
[DataMember]
String StringOne;
}
[DataContract]
public class MyTwo : MyObject
{
[DataMember]
String StringTwo;
}
이들은 인터페이스가 아니라 클래스입니다. DataContract 특성이 ServiceContract 특성을 대체했습니다. KnownType 특성이 ServiceKnownType 특성을 대체했습니다. 이것은 제가 본 것에서보다 정식입니다.
서비스 계약은 다음과 같이 정의된다 :
[ServiceContract]
public interface IConnection
{
[OperationContract]
[ServiceKnownType(typeof(MyOne))]
[ServiceKnownType(typeof(MyTwo))]
MyObject RetrieveObject(Guid ObjectID);
[OperationContract]
[ServiceKnownType(typeof(MyOne))]
[ServiceKnownType(typeof(MyTwo))]
Guid StoreObject(MyObject NewObject);
}
당신은 ServiceKnownType가이 계약의 모든 작업에 적용하도록 (즉,의 ServiceContract 특성 아래) 계약 수준에서 속성을 넣을 수 있습니다.
[ServiceContract]
[ServiceKnownType(typeof(MyOne))]
[ServiceKnownType(typeof(MyTwo))]
public interface IConnection
{
[OperationContract]
MyObject RetrieveObject(Guid ObjectID);
[OperationContract]
Guid StoreObject(MyObject NewObject);
}
당신은 이 같은 데이터 계약에 용도의 인터페이스 할 수 있습니다
interface IEmployee
{
string FirstName
{ get; set; }
string LastName
{ get; set; }
}
[DataContact]
class Employee : IEmployee
{...}
는 그러나, IEmployee 인터페이스 내 보낸 메타 데이터에 포함되지 않습니다. 따라서 svcutil을 사용하여 프록시 클래스를 생성하면 클라이언트는 IEmployee에 대해 알 수 없습니다. 서비스와 클라이언트가 동일한 응용 프로그램에있는 경우 큰 문제는 아닙니다 (이는 응용 프로그램 도메인간에 통신하는 좋은 방법입니다). 그러나 클라이언트가 서비스와 분리되어 있다면 (압도적 인 경우가 많을 것입니다.) 클라이언트 측에서 IEmployee 인터페이스를 수동으로 복제해야하기 때문에 문제가됩니다.
WCF로 언급 한 IEmployee 인터페이스를 사용하는 구체적인 예를 만들 수 있습니까? – Kenci
@Matt Davis, 한 가지 부족 :) 아마도 xml의 일부분일까요? –