Megosztás a következőn keresztül:


Ismert típusok

A KnownTypes-minta bemutatja, hogyan adható meg információ az adatszerződés származtatott típusairól. Az adatszerződések lehetővé teszik strukturált adatok átadását szolgáltatásokba és szolgáltatásokból. Az objektumorientált programozásban egy másik típustól öröklő típus használható az eredeti típus helyett. A szolgáltatásorientált programozásban a rendszer nem típusokat, hanem sémákat közöl, ezért a típusok közötti kapcsolat nem marad meg. Az KnownTypeAttribute attribútum lehetővé teszi, hogy a származtatott típusokkal kapcsolatos információk szerepeljenek az adatszerződésben. Ha ezt a mechanizmust nem használják, származtatott típus nem küldhető el vagy fogadható oda, ahol alaptípus várható.

Feljegyzés

A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.

A szolgáltatásra vonatkozó szolgáltatási szerződés összetett számokat használ, ahogy az az alábbi mintakódban is látható.

// 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);
}

DataMemberAttribute Az DataContractAttribute és az ComplexNumber osztályra alkalmazva jelzi, hogy az osztály mely mezőit lehet átadni az ügyfél és a szolgáltatás között. A származtatott ComplexNumberWithMagnitude osztály a következő helyett ComplexNumberhasználható: . A KnownTypeAttribute típus attribútuma ComplexNumber ezt jelzi.

[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;
    }
}

A ComplexNumberWithMagnitude típus származik, ComplexNumber de hozzáad egy további adattagot. 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(); }
    }
}

Az ismert típusok bemutatásához a szolgáltatás úgy van implementálva, hogy csak összeadásra és kivonásra ad vissza.ComplexNumberWithMagnitude (Annak ellenére, hogy a szerződés meghatározza ComplexNumber, ez az KnownTypeAttribute attribútum miatt engedélyezett). A szorzás és az osztás továbbra is az alaptípust ComplexNumber adja vissza.

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);
    }
}

Az ügyfélen a szolgáltatási szerződés és az adatszerződés is a generatedClient.cs forrásfájlban van definiálva, amelyet a ServiceModel Metadata segédprogram (Svcutil.exe) hoz létre a szolgáltatás metaadataiból. Mivel az KnownTypeAttribute attribútum a szolgáltatás adatszerződésében van megadva, az ügyfél a szolgáltatás használatakor képes fogadni az osztályokat és ComplexNumberWithMagnitude az ComplexNumber osztályokat is. Az ügyfél észleli, hogy kapott-e, ComplexNumberWithMagnitude és létrehozza a megfelelő kimenetet:

// 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");
}

A minta futtatásakor a művelet kérései és válaszai megjelennek az ügyfélkonzol ablakában. Vegye figyelembe, hogy a rendszer egy nagyságrendet nyomtat összeadásra és kivonásra, de nem szorzásra és osztásra a szolgáltatás implementálásának módja miatt. Nyomja le az ENTER billentyűt az ügyfélablakban az ügyfél leállításához.

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.

A minta beállítása, összeállítása és futtatása

  1. Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták egyszeri beállítási eljárását.

  2. A megoldás C# vagy Visual Basic .NET kiadásának létrehozásához kövesse a Windows Communication Foundation-minták készítéséhez szükséges utasításokat.

  3. Ha a mintát egy vagy több gép közötti konfigurációban szeretné futtatni, kövesse a Windows Communication Foundation-minták futtatásával kapcsolatos utasításokat.