• 30.03.2017
  • 4 minute de citit
    • H

    • v

    • n

    • n

    • g

In acest articol

Acest esantion arata cum se specifica informatii despre tipurile derivate intr-un contract de date. Contractele de date va permit sa transmiteti date structurate catre si de la servicii. In programarea orientata obiect, un tip care mosteneste de la un alt tip poate fi utilizat in locul tipului original. In programarea orientata spre servicii, sunt comunicate mai degraba scheme decat tipuri si, prin urmare, relatia dintre tipuri nu este pastrata. Atributul KnownTypeAttribute permite includerea informatiilor despre tipurile derivate in contractul de date. Daca acest mecanism nu este utilizat, un tip derivat nu poate fi trimis sau primit acolo unde se asteapta un tip de baza.

Nota

Procedura de configurare si instructiunile de constructie pentru acest esantion se afla la sfarsitul acestui subiect.

Contractul de service pentru serviciu utilizeaza numere complexe, asa cum se arata in urmatorul exemplu de cod.

// Definiti un contract de servicii. [ServiceContract (namespace = “http: //Microsoft.ServiceModel.Samples”)] interfata publica ICalculator {[OperationContract] ComplexNumber Add (ComplexNumber n1, ComplexNumber n2); [OperationContract] Scadere Numar Complex (Numar Complex n1, Numar Complex n2); [OperationContract] Multiplicarea numarului complex (Numarul complex n1, Numarul complex n2); [OperationContract] Divizia numarului complex (Numarul complex n1, Numarul complex n2); }

DataContractAttribute si DataMemberAttribute se aplica clasei ComplexNumber pentru a indica ce campuri ale clasei pot fi transmise intre client si serviciu. Clasa derivata ComplexNumberWithMagnitude poate fi utilizata in locul ComplexNumber. Atributul KnownTypeAttribute din tipul ComplexNumber indica acest lucru.

[DataContract (namespace = “http: //Microsoft.ServiceModel.Samples”)] [KnownType (typeof (ComplexNumberWithMagnitude))] clasa publica ComplexNumber {[DataMember] public double Real = 0.0D; [DataMember] public double Imaginary = 0,0D; public ComplexNumber (dublu real, dublu imaginar) {this.Real = real; this.Imaginary = imaginar; }}

Tipul ComplexNumberWithMagnitude deriva din ComplexNumber, dar adauga un membru de date suplimentar, Magnitude.

[DataContract (namespace = “http: //Microsoft.ServiceModel.Samples”)] clasa publica ComplexNumberWithMagnitude: ComplexNumber {public ComplexNumberWithMagnitude (dublu real, dublu imaginar): baza (real, imaginar) {} [DataMember] public double Magnitude { {return Math.Sqrt (Imaginar * Imaginar + Real * Real); } set {throw new NotImplementedException (); }}}

Pentru a demonstra caracteristica tipurilor cunoscute, serviciul este implementat in asa fel incat sa returneze un ComplexNumberWithMagnitude numai pentru adunare si scadere. (Chiar daca contractul specifica ComplexNumber, acest lucru este permis datorita atributului KnownTypeAttribute). Inmultirea si divizarea returneaza in continuare tipul de baza ComplexNumber.

public class DataContractCalculatorService: IDataContractCalculator {public ComplexNumber Add (ComplexNumber n1, ComplexNumber n2) {// Returneaza tipul derivat. returneaza noul ComplexNumberWithMagnitude (n1.Real + n2.Real, n1.Imaginary + n2.Imaginary); } public ComplexNumber Subtract (ComplexNumber n1, ComplexNumber n2) {// Returneaza tipul derivat. returneaza noul ComplexNumberWithMagnitude (n1.Real – n2.Real, n1.Imaginary – n2.Imaginary); } public ComplexNumber Multiply (ComplexNumber n1, ComplexNumber n2) {double real1 = n1.Real * n2.Real; imaginar dublu1 = n1.Real * n2.Imaginar; imaginar dublu2 = n2.Real * n1.Imaginar; dublu real2 = n1.Imaginar * n2.Imaginar * -1; // Returneaza tipul de baza. returneaza noul numar complex (real1 + real2, imaginar1 + imaginar2); } public ComplexNumber Divide (ComplexNumber n1, Numar complex n2) {Numar complex conjugat = nou Numar complex (n2.Real, -1 * n2.Imaginar); Numarator numar complex = Inmultire (n1, conjugat); Numitorul numarului complex = Inmultire (n2, conjugat); // Returneaza tipul de baza. returneaza noul numar complex (numerator.Real / denominator.Real, numerator.Imaginary); }}

Pe client, atat contractul de servicii, cat si contractul de date sunt definite in fisierul sursa generateClient.cs, care este generat de ServiceModel Metadata Utility Tool (Svcutil.exe) din metadatele serviciului. Deoarece atributul KnownTypeAttribute este specificat in contractul de date al serviciului, clientul poate primi atat clasele ComplexNumber, cat si ComplexNumberWithMagnitude atunci cand foloseste serviciul. Clientul detecteaza daca a obtinut un ComplexNumberWithMagnitude si genereaza rezultatul corespunzator:

// Creati un client DataContractCalculatorClient client = new DataContractCalculatorClient (); // Apelati operatiunea Adaugare serviciu. Valoare Numar Complex1 = Numar Complex nou () {real = 1, imaginar = 2}; Valoare Numar Complex2 = Numar Complex nou () {real = 3, imaginar = 4}; Rezultatul numarului complex = client.Add (valoare1, valoare2); Console.WriteLine (“Adaugati ({0} + {1} i, {2} + {3} i) = {4} + {5} i”, value1.real, value1.imaginary, value2.real, value2. imaginar, rezultat.real, rezultat.imaginar); if (rezultatul este ComplexNumberWithMagnitude) {Console.WriteLine (“Magnitude: {0}”, ((ComplexNumberWithMagnitude) result) .Magnitude); } else {Console.WriteLine (“Nu s-a trimis nicio magnitudine de la serviciu”); }

Cand rulati esantionul, solicitarile si raspunsurile operatiunii sunt afisate in fereastra consolei clientului. Retineti ca o magnitudine este tiparita pentru adunare si scadere, dar nu pentru multiplicare si divizare din cauza modului in care a fost implementat serviciul. Apasati ENTER in fereastra clientului pentru a inchide clientul.

Adaugati (1 + 2i, 3 + 4i) = 4 + 6i Magnitudine: 7.21110255092798 Scadere (1 + 2i, 3 + 4i) = -2 + -2i Magnitudine: 2.82842712474619 Inmultiti (2 + 3i, 4 + 7i) = -13 + 26i Nu s-a trimis nicio magnitudine din serviciul Divide (3 + 7i, 5 + -2i) = 0,0344827586206897 + 41i Nu s-a trimis nicio magnitudine din serviciu Apasati <ENTER> pentru a termina clientul.

Pentru a configura, construi si rula esantionul

  1. Asigurati-va ca ati efectuat procedura de configurare unica pentru mostrele Windows Communication Foundation.

  2. Pentru a crea editia C # sau Visual Basic .NET a solutiei, urmati instructiunile din Construirea probelor Windows Communication Foundation.

  3. Pentru a rula esantionul intr-o configuratie simpla sau incrucisata, urmati instructiunile din Executarea probelor Windows Communication Foundation.

Important

Probele pot fi deja instalate pe aparatul dvs. Verificati urmatorul director (implicit) inainte de a continua.

<InstallDrive>: \ WF_WCF_Samples

Daca acest director nu exista, accesati esantioanele Windows Communication Foundation (WCF) si Windows Workflow Foundation (WF) pentru .NET Framework 4 pentru a descarca toate esantioanele Windows Communication Foundation (WCF) si WF. Acest esantion se afla in urmatorul director.

<InstallDrive>: \ WF_WCF_Samples \ WCF \ Basic \ Contract \ Data \ KnownTypes

3 movies porn film hard cento x cento
video porno gratis nappi film hard centoxcento
porno all’italiana film hard malena la pugliese
film xxx italian film hard roberta gemma
new porn italia film hard salieri
100×100 porn film in streaming della centoxcento
rita porn film in streaming xxx
mila milan porno film porn free
danza classica porno film porn in streaming
roberta gemma x videos film porn italian
segretaria xxx film porn streaming
film porno in streaming film porn xxx
malena e rocco video hard film porno 100 x 100
moglie centoxcento film porno 100×100
rocco siffredi porno tube film porno 100×100 streaming
valeria curtis streaming film porno alex magni
morena capoccia porno film porno cappuccetto rosso
centopercento film porno film porno cento per cento streaming
sara porn film porno cento x cento
valentina nappi rimming film porno cento x cento streaming