Es ist ehrlich schon lange her, das ich eine WCF Service geschrieben habe, Mit Silverlight kommt ja immer RIA Services zum Einsatz. Diese werden aber von WinRT nicht unterstützt. Jedenfalls keine Proxy Generierung und andere Annehmlichkeiten.
Um also nicht alles per Hand machen zu müssen, wird sich mein nächstes Beispiel um WCF als METRO Client kümmern. Leider habe ich auf dem Gerat grad keinen WCF Service zur Hand. Also Step by Step einen WCF Service auf Basis der Nordwind Datenbank und der Kunden Tabelle gebaut. Es kommt Visual Studio 2012 und Entity Framework zum Einsatz.
Zunächst erst mal die Datenbank. Ich habe mich für SQLCompact entschieden. Sollte eigentlich mitinstalliert werden, Mit dem Setup der Datei SSCEVSTools-ENU.msi wird dann im Verzeichnis C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\Samples die Northwind.sdf erzeugt.
Windows 8 METRO Anwendungen kennen kein ADO.NET und auch kein WCF direkt. Datenbank Server Zugriffe müssen immer über einen Service Layer hindurch. Der METRO Solution wird dann ein Web Projekt hinzugefügt. Hier habe ich ein MVC Projekt gewählt.
In Web Projekt wird dann ein Verzeichnis APP_DATA erzeugt in das die Datei Northwind.SDF Datei kopiert wird,
Als nächstes wird ein Entity Framework Modell aus der Datenbank erzeugt. Das vor allem um Zeit zu sparen.
Für das Modell wird die Customer Tabelle ausgewählt.
Wer sich mit WCF beschäftigt hat, weis das es jetzt an den Contract geht, eigentlich ein einfaches Interface. Silverlight Enabled WCF Services brauchen das Interface nicht codiert.
Der Service liefert eine Liste der Kunden haben vom Typ Customers mit der Methode GetCustomers. Und die Funktion AddCustomer, fügt einen neuen Kunden ein. Rückgabe ist die Anzahl aller Kunden.
<ServiceContract()>
Public Interface IService1
<OperationContract()>
Function GetCustomer() As List(Of Customers)
<OperationContract()>
Function addCustomer(ByVal cust As Customers) As Integer
Man mag über Interfaces denken was man will, wenn man eines hat ist es sehr einfach zu implementieren. Im Service (scv) einfach implements IService1 tippen und schon steht der Funktionsrumpf im Code.
Dank Enties muss im WCF Service kaum noch VB.NET Code getippt werden.
Public Class Service1
Implements IService1
Public Sub New()
End Sub
Public Function addCustomer(cust As Customers) As Integer Implements IService1.addCustomer
Dim ctx As New NorthwindEntities
ctx.Customers.AddObject(cust)
ctx.SaveChanges()
Return ctx.Customers.ToList.Count
End Function
Public Function GetCustomers() As List(Of Customers) Implements IService1.GetCustomer
Dim ctx As New NorthwindEntities
Return ctx.Customers.ToList
End Function
End Class
Die Liste der Kunden wird mit einem zwei Zeiler aus dem EF Modell geholt. Man könnte natürlich auch per SQLConnection die Daten holen und in einem eigenen definierten Kunden Objekt ablegen. Braucht eben nur rund 30-50 Zeilen Code, mindestens.
Den WCF Service kann man im Browser aufrufen und schon mal schauen ob das Hosting und die WSDL passt.
http://localhost:12933/Service1.svc
Man kann auch den in Visual Studio 11 enthaltenen WCF Test Client verwenden. Dieser scheint aber mit dem Datentyp Customers aus dem EF Model Probleme zu haben, so das der Funktionsaufruf GetCustomer nicht möglich ist.