Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
KnownTypes örneği, bir veri sözleşmesindeki türetilmiş türler hakkındaki bilgilerin nasıl belirtileceğini gösterir. Veri anlaşmaları, yapılandırılmış verileri hizmetlere ve hizmetlerden geçirmenize olanak sağlar. Nesne odaklı programlamada, özgün türün yerine başka bir türden devralan bir tür kullanılabilir. Hizmet odaklı programlamada, türler yerine şemalar iletilir ve bu nedenle türler arasındaki ilişki korunmaz. özniteliği, KnownTypeAttribute türetilmiş türler hakkındaki bilgilerin veri sözleşmesine eklenmesine izin verir. Bu mekanizma kullanılmazsa, türetilmiş bir tür, temel türün beklendiği yere gönderilemez veya alınamaz.
Uyarı
Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.
Hizmetin hizmet sözleşmesi, aşağıdaki örnek kodda gösterildiği gibi karmaşık sayılar kullanır.
// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
ComplexNumber Add(ComplexNumber n1, ComplexNumber n2);
[OperationContract]
ComplexNumber Subtract(ComplexNumber n1, ComplexNumber n2);
[OperationContract]
ComplexNumber Multiply(ComplexNumber n1, ComplexNumber n2);
[OperationContract]
ComplexNumber Divide(ComplexNumber n1, ComplexNumber n2);
}
DataContractAttribute ve DataMemberAttribute, sınıfın hangi alanlarının istemci ile hizmet arasında aktarılabileceğini belirtmek için ComplexNumber sınıfına uygulanır. Türetilmiş ComplexNumberWithMagnitude sınıf yerine ComplexNumberkullanılabilir.
KnownTypeAttribute türündeki ComplexNumber özniteliği bunu belirtir.
[DataContract(Namespace="http://Microsoft.ServiceModel.Samples")]
[KnownType(typeof(ComplexNumberWithMagnitude))]
public class ComplexNumber
{
[DataMember]
public double Real = 0.0D;
[DataMember]
public double Imaginary = 0.0D;
public ComplexNumber(double real, double imaginary)
{
this.Real = real;
this.Imaginary = imaginary;
}
}
türü ComplexNumberWithMagnitude öğesinden ComplexNumber türetilir, ancak ek bir veri üyesi ekler: Magnitude.
[DataContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public class ComplexNumberWithMagnitude : ComplexNumber
{
public ComplexNumberWithMagnitude(double real, double imaginary) :
base(real, imaginary) { }
[DataMember]
public double Magnitude
{
get { return Math.Sqrt(Imaginary*Imaginary + Real*Real); }
set { throw new NotImplementedException(); }
}
}
Bilinen türler özelliğini göstermek için hizmet, yalnızca toplama ve çıkarma için bir ComplexNumberWithMagnitude döndürecek şekilde uygulanmıştır. (Sözleşmede ComplexNumber belirtilmesine rağmen, KnownTypeAttribute özniteliği nedeniyle buna izin verilir). Çarpma ve bölme, yine temel ComplexNumber türünü döndürür.
public class DataContractCalculatorService : IDataContractCalculator
{
public ComplexNumber Add(ComplexNumber n1, ComplexNumber n2)
{
//Return the derived type.
return new ComplexNumberWithMagnitude(n1.Real + n2.Real,
n1.Imaginary + n2.Imaginary);
}
public ComplexNumber Subtract(ComplexNumber n1, ComplexNumber n2)
{
//Return the derived type.
return new ComplexNumberWithMagnitude(n1.Real - n2.Real,
n1.Imaginary - n2.Imaginary);
}
public ComplexNumber Multiply(ComplexNumber n1, ComplexNumber n2)
{
double real1 = n1.Real * n2.Real;
double imaginary1 = n1.Real * n2.Imaginary;
double imaginary2 = n2.Real * n1.Imaginary;
double real2 = n1.Imaginary * n2.Imaginary * -1;
//Return the base type.
return new ComplexNumber(real1 + real2, imaginary1 +
imaginary2);
}
public ComplexNumber Divide(ComplexNumber n1, ComplexNumber n2)
{
ComplexNumber conjugate = new ComplexNumber(n2.Real,
-1*n2.Imaginary);
ComplexNumber numerator = Multiply(n1, conjugate);
ComplexNumber denominator = Multiply(n2, conjugate);
//Return the base type.
return new ComplexNumber(numerator.Real / denominator.Real,
numerator.Imaginary);
}
}
İstemcide, hizmet meta verilerinden ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) tarafından oluşturulan kaynak dosya generatedClient.cs hem hizmet sözleşmesi hem de veri sözleşmesi tanımlanır.
KnownTypeAttribute özniteliği hizmetin veri sözleşmesinde belirtildiğinden, istemci hizmeti kullanırken hem ComplexNumber hem de ComplexNumberWithMagnitude sınıflarını alabilir. İstemci, bir ComplexNumberWithMagnitude alıp almadığını algılar ve uygun sonucu üretir.
// Create a client
DataContractCalculatorClient client =
new DataContractCalculatorClient();
// Call the Add service operation.
ComplexNumber value1 = new ComplexNumber() { real = 1, imaginary = 2 };
ComplexNumber value2 = new ComplexNumber() { real = 3, imaginary = 4 };
ComplexNumber result = client.Add(value1, value2);
Console.WriteLine("Add({0} + {1}i, {2} + {3}i) = {4} + {5}i",
value1.real, value1.imaginary, value2.real, value2.imaginary,
result.real, result.imaginary);
if (result is ComplexNumberWithMagnitude)
{
Console.WriteLine("Magnitude: {0}",
((ComplexNumberWithMagnitude)result).Magnitude);
}
else
{
Console.WriteLine("No magnitude was sent from the service");
}
Örneği çalıştırdığınızda, işlemin istekleri ve yanıtları istemci konsolu penceresinde görüntülenir. Toplama ve çıkarma için bir büyüklüğün yazdırıldığını, ancak hizmetin uygulanış biçimi nedeniyle çarpma ve bölme için yazdırılmadığını unutmayın. İstemciyi kapatmak için istemci penceresinde ENTER tuşuna basın.
Add(1 + 2i, 3 + 4i) = 4 + 6i
Magnitude: 7.21110255092798
Subtract(1 + 2i, 3 + 4i) = -2 + -2i
Magnitude: 2.82842712474619
Multiply(2 + 3i, 4 + 7i) = -13 + 26i
No magnitude was sent from the service
Divide(3 + 7i, 5 + -2i) = 0.0344827586206897 + 41i
No magnitude was sent from the service
Press <ENTER> to terminate client.
Örneği ayarlamak, derlemek ve çalıştırmak için
Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.
Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.
Örneği tek bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.