Mittwoch, 11. September 2013

Generische Datenspeicherung mit XML - Teil 7 (Data Storage als Web-Service mit WCF)

Bisherige Teile dieser Lecture

Falls Sie die bisherigen Teile dieser Lecture noch nicht kennen:

Kurze Rekapitulation was wir machen wollen

Nachdem wir alle wesentlichen Komponenten für einen generischen Data Storage implementiert haben, wollen wir diesen jetzt auch noch als WCF-Service verfügbar machen (vorausgesetzt wird ein Verständnis für die grundlegende Funktionsweise von WCF - dies zu vermitteln ist nicht Bestandteil dieser Lecture)

Übersicht zur geplanten Implementierung

Für den Verwender der Komponente sollte solch ein Service Data Storage genau gleich sein wie die bisher schon vorgestellten Data Storages. Von dem her ist auch die Implementierung analog zu diesen. Wir benötigen einen Service Data Storage, welcher intern einen Generic Entity Service Data Storage nutzt, welcher wiederrum die Daten mit einem Web-Service austauscht. Dieser speichert die Daten dann in einem der bekannten Generic Entity Data Storages:

Für die Implementierung mit WCF müssen wir für den Service einen ServiceContract in Form eines Interfaces implementieren - das IDataStorageService Interface. Außerdem müssen die zu übertragenden Daten einen DataContract implementieren. Hier müssen wir allerdings nur die Klasse GenericEntity entsprechend erweitern. Aus diesem Grund übertragen wir übrigens auch mit dem Service nicht die eigentlich zu speichernden Objekte sondern serialisieren diese bereits clientseitig - sonst müssten bereits die zu speichernden Objekte den DataContract definieren

Hier ein Überblick zu den benötigten Klassen der Client-Seite:

... und der Server-Seite:

Implementierung

Beginnen wir auf der Client-Seite mit der eigentlichen Implementierung. Die Klasse ServiceDataStorage ist dabei trivial - wie alle anderen Data Storages übergibt sie ihrer Basisklasse lediglich einen Generic Entity Data Storage

Interessanter ist die Implementierug der Klasse GenericEntityServiceDataStorage. Allerdings ist auch diese nicht allzu aufwendig. Im Konstruktor erzeugen wir uns über eine "Channel-Factory" ein Objekt vom Typ IDataStorageService. Die eigentliche Implementierung der Data Storage-Methoden sind dann nur noch Wrapper-Aufrufe mit diesem Objekt. Die "Channel-Factory" bekommt die Informationen über den anzusprechenden Service in Form eines "Endpoint Configuration Names" übergeben. Hier das wesentliche Code-Segment aus dem Konstruktor:

service = new ChannelFactory<IDataStorageService>(endpointConfigName); service.Credentials.UserName.UserName = serviceUserName; service.Credentials.UserName.Password = servicePassword; DataStorageService = service.CreateChannel();

Eine kleine Ergänzung implementieren wir allerdings noch - der Zugriff auf die Methode "FindAppicationKeys" wollen wir nicht so einfach machen, wenn wir den Data Storage als Service veröffentlichen. Welche anderen Application Keys sonst noch im Data Storage verwendet werden geht den einfachen Verwender dieses Services nichts an. Aus diesem Grund führen wir hier Administrator-Credentials ein welche beim Aufruf dieser Methoden vorliegen müssen

Auch auf der Server-Seite ist die Implementierung trivial - der ServiceDataStorage dient lediglich als Wrapper für den eigentlichen Generic Entity Data Storage auf dem Server

Damit sind wir fertig mit der reinen Erweiterung unserer Komponente. Von Interesse wäre jetzt noch eine Beispiel-Konfiguration für solch ein Service-Szenario. Dieses schauen wir uns dann im nächsten Teil dieser Lekture an

Nächster Schritt

Damit sind wir eigentlich am Ende dessen, was mit dieser Lecture erreicht werden sollte. Wir haben eine Komponente entwickelt, mit Hilfe derer wir einfach und auf generische Art und Weise Objekte speichern können und wir können diese nun auch als WCF-Service veröffentlichen. Im abschließenden letzten Teil der Lecture stellen wir nun noch die Konfiguration einer Demo-Anwendung vor

... to be continued

Autor: Thomas Gysser | www.advadev.de

Keine Kommentare:

Kommentar veröffentlichen