Twój przykład nie będzie kompilować, ponieważ interfejsy nie może zawierać pola, co jest, co ObjectID, StringOne i StringTwo są. To, co próbujesz zdefiniować za pomocą IObject, IOne i ITwo, to umowa danych, a nie umowa o świadczenie usług. Jako taki powinieneś używać atrybutu DataContract, a nie atrybutu ServiceContract i klas, a nie interfejsów.
[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;
}
Należy zauważyć, że są to klasy, a nie interfejsy. Atrybut DataContract zastąpił atrybut ServiceContract. Atrybut KnownType zastąpił atrybut ServiceKnownType. To jest bardziej kanoniczne z tego, co widziałem.
Twoja umowa usługa będzie wówczas zdefiniowane tak:
[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);
}
można umieścić ServiceKnownType atrybuty na poziomie umowy (tj pod atrybutem ServiceContract) mieć ona zastosowanie do wszystkich operacji umowy.
[ServiceContract]
[ServiceKnownType(typeof(MyOne))]
[ServiceKnownType(typeof(MyTwo))]
public interface IConnection
{
[OperationContract]
MyObject RetrieveObject(Guid ObjectID);
[OperationContract]
Guid StoreObject(MyObject NewObject);
}
Ty może użytku interfejsy w swoich umowach danych takie jak to:
interface IEmployee
{
string FirstName
{ get; set; }
string LastName
{ get; set; }
}
[DataContact]
class Employee : IEmployee
{...}
Jednak interfejs IEmployee nie jest uwzględniony w eksportowanym metadanych. Więc jeśli użyjesz svcutil do wygenerowania klas proxy, twoi klienci nie będą wiedzieć o IEmployee. Nie jest to wielka sprawa, jeśli twoja usługa i klient znajdują się w tej samej aplikacji (co jest dobrym sposobem na komunikację między domenami aplikacji). Jeśli jednak twój klient jest oddzielony od twojej usługi (w przeważającej większości przypadków będzie), staje się to problematyczne, ponieważ będziesz musiał ręcznie zduplikować interfejs IEmployee po stronie klienta.
Czy można podać konkretny przykład wykorzystania interfejsu IEmployee, o którym wspomniałeś, z funkcją WCF? – Kenci
@Matt Davis, jedno jest brak :) Może jakiś kawałek xml? –