Sizin örnek. IObject, IOne ve ITwo ile tanımlamaya çalıştığınız şey bir hizmet sözleşmesi değil, bir veri sözleşmesidir. Bu nedenle, DataContract özniteliğini, ServiceContract özniteliğini ve sınıflarını değil arabirimleri kullanmalısınız.
[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;
}
Bunlar, arabirimler değil, sınıflar olduğuna dikkat edin. DataContract özniteliği ServiceContract özniteliğini değiştirdi. KnownType özniteliği ServiceKnownType özniteliğinin yerini almıştır. Bu gördüğümden daha kanonik.
Servis sözleşmesi sonra böyle tanımlanabilir olacaktır:
[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);
}
Sen ServiceKnownType o sözleşmenin tüm operasyonlar için geçerli olması (yani ServiceContract özniteliği altında) sözleşme düzeyinde niteliklerini koyabilirsiniz.
[ServiceContract]
[ServiceKnownType(typeof(MyOne))]
[ServiceKnownType(typeof(MyTwo))]
public interface IConnection
{
[OperationContract]
MyObject RetrieveObject(Guid ObjectID);
[OperationContract]
Guid StoreObject(MyObject NewObject);
}
Sen böyle veri sözleşmelerinde kullanım arayüzleri olabilir:
interface IEmployee
{
string FirstName
{ get; set; }
string LastName
{ get; set; }
}
[DataContact]
class Employee : IEmployee
{...}
Ancak IEmployee arayüzü ihraç meta veriler dahil değildir. Proxy sınıflarınızı oluşturmak için svcutil kullanırsanız, müşterileriniz IEmployee hakkında bilgi sahibi olmayacaktır. Hizmetiniz ve istemciniz aynı uygulamada bulunuyorsa (bu, uygulama alanları arasında iletişim kurmanın iyi bir yoludur) büyük bir sorun değildir. Ancak, istemciniz servisinizden ayrıysa (vakaların büyük çoğunluğunda, bu olacaktır), bu sorunlu hale gelir çünkü IEmployee arayüzünü istemci tarafında manuel olarak kopyalamanız gerekir.
Belirtilen IEmployee arayüzünün WCF ile nasıl kullanılacağına dair somut bir örnek oluşturmanız mümkün mü? – Kenci
@Matt Davis, bir şey eksiktir :) Belki bir parça xml? –