.NET 3.0: Einheitliche Kommunikation über die WCF

Service Contracts

Der Service Contract beschreibt eine Reihe zusammenhängender Operationen in einem gemeinsamen Interface. Das folgende Interface ICalculator

public interface ICalculator
{
double Add(double n1, double n2);
double Subtract(double n1, double n2);
double Multiply(double n1, double n2);
double Divide(double n1, double n2);
}

bietet vier Methoden zum Ausführen einfacher Berechnungen an. Um daraus einen Service Contract zu machen, genügt es, das Interface mit einem [ServiceContract] Attribut auszustatten.

// Define a calculator service contract.
[ServiceContract(Namespace="http://tecCHANNEL.Samples")]
public interface ICalculator
{
double Add(double n1, double n2);
double Subtract(double n1, double n2);
double Multiply(double n1, double n2);
double Divide(double n1, double n2);
}

Das Attribut akzeptiert als optionales Argument einen Namespace, dessen Aufgabe es ist, den Interface-Namen eindeutig zu machen.

Das oben stehende Beispiel definiert jetzt zwar einen Service Contract „tecCHAN-NEL.Samples.ICalculator“, doch dieser Service würde über keine Methoden verfügen. Denn obwohl das Interface ICalculator die vier Methoden Add, Substract, Multiply und Divide enthält, werden diese nicht automatisch Teil des Service Contracts. Um dies zu erreichen, müssen die Methoden ebenfalls mit einem Attribut versehen werden:

// Define a calculator service contract.
[ServiceContract(Namespace="http://tecCHANNEL.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
}

Erst jetzt werden die vier Interface-Methoden auch als Methoden des Service Contracts nach außen exponiert. Hier wird ein zentrales Designprinzip der Windows Communication Foundation deutlich: Alle Methoden oder Datenelemente, die nach außen sichtbar werden sollen, muss der Entwickler über Attribute als solche kennzeichnen. Dies bedeutet einen klaren und bewussten Bruch mit den Gepflogenheiten unter .NET Remoting, wo es möglich ist, ein komplexes Interface einfach dadurch von außen zugänglich zu machen, indem es von der Klasse MarshalByRefObject abgeleitet wird.