ADO.NET Data Service - Der REST Anbieter für Modelle

by Gregor Biswanger 23. April 2009 12:19

Web-Services haben sich in Laufe der letzten Jahre sehr etabliert. Ist ja auch kein Wunder, sie bringen auch eine Handvoll von Vorteile mit sich. Durch den allgemeinen WSDL-Standard, kann eine externe Kommunikation der Daten, durch unterschiedliche Technologien konsumiert werden. Es spielt am Ende keine Rolle mehr, ob der Client nun eine .NET oder Java-Applikation ist. Dennoch sind Web-Services nicht nur wegen Ihrer Flexibilität so beliebt, sondern auch an der einfachen Implementierungsunterstützung der einzelnen IDE´s.

Wie bereits beim Blog-Artikel „Web-Service und die Datenschicht – Alles nur Facade?„ - kann der Zugriff der Server-Daten einfachst über eine Facade zur Verfügung gestellt werden. Erfahrungsgemäß ist hier zu jeder Anforderung ein CRUD (Create, Read, Update und Delete) zu Programmieren. Das bringt viel an Pflege und Arbeit mit sich. Viele Entwickler kämpfen bereits Täglich mit diesem Problem. Doch wie bereits in zahlreichen Artikeln von mir geschildert, gibt es zu immer wiederkehrenden Problemen meist ein Entwurfsmuster „Design-Pattern“. In diesem Fall würde ein Unit-of-Work-Pattern, die Anforderungen mit einem CRUD perfekt abdecken.

Nun wäre es ein perfekter Lösungsweg, die Facade des Web-Services mit einem Unit-of-Work-Pattern auszustatten. Doch bevor man sich Gedanken um die Umsetzung macht, soll ein Blick auf bisherige Technologien geworfen werden. Sehr Modern ist derzeit die Datenkommunikation mittels REST “Representational State Transfer“. REST ist eine Technologie, die von Anlauf des Internet Zeitalters existiert. Denn jede Kommunikation vom Browser zum Web-Server geschieht mittels REST beim HTTP-Protokoll. REST stellt für diese Kommunikation genau genommen eine Unit-of-Work-Lösung bereit, demnach wird hier als flexibler weg ein CRUD zur Verfügung gestellt. Der Hauptsächliche nutzen von REST fand durch das Aufrufen der Websites im Adress-Zeilen Bereich mittels URL statt, oder das versenden von Formularen (Post). Unterdessen bei einer solchen abfrage bisher kaum Daten zur Kommunikationsbeschreibung gebraucht werden, wie zum Beispiel eine XML-Definition bei WSDL (Web-Services), ist REST auch noch sehr Performant. Weil hier eine umfangreiche Kommunikationsbeschreibung erspart bleibt. Das einzige Problem steht hierbei nur im Weg, wenn ein fester Aufbau eines Web-Services mittels REST von unterschiedlichen Anbietern konsumiert werden soll, fehlt die erleichterte WSDL-Definition.

ADO.NET Data Service erstellen

Mit dem .NET-Framework 3.0 ist eine neue Kommunikationstechnologie mitgekommen, die Windows Communication Foundation (kurz WCF). Mit WCF lassen sich Kommunikationen erstellen, die nachträglich flexibel eingesetzt werden können. Es spielt später keine Rolle mehr, ob eine Kommunikation noch über ein Web-Service oder Socket stattfindet. Zudem bringt WCF noch einiges mehr mit sich, obwohl Web-Services Asynchron verarbeitet werden, kann ein Client von Web-Service aufgerufen werden.

ADO.NET Data Service ist mit dem .NET-Framework 3.5 gemeinsam mit dem Entity-Framework und LINQ dazugekommen. ADO.NET Data Service basiert auf WCF und ist für das bereitstellen von Entity-Framework-Modellen konzeptioniert worden. Dabei werden die Modelle automatisiert als Web-Services zur Verfügung gestellt. Der Web-Services bietet das komplette CRUD mittels REST an.

Um das besser zu verbildlichen, erzeugen wir ein neues Projekt „ASP.NET Web Application“ mit dem Namen ADONETExample.WebDAL, und der Solution Name lautet: ADONETExample (siehe Abb.1.1).



Abb.1.1. – Neues „ASP.NET Web Application“-Projekt in Visual Studio erstellen.

Als nächstes wird die zur Verfügung gestellte Default.aspx-Datei gelöscht, und dem Projekt ein neues Verzeichnis mit Model erzeugt. In das Verzeichnis Model muss nun ein neues Item hinzugefügt werden (siehe Abb.1.2).



Abb.1.2. – Neues Item hinzufügen.

Hier erzeugen wir uns ein neues ADO.NET Entity Data Model. Damit wird vom Entity-Framework (O/R-Mapper) ein Abbild der Datenbanktabellen als Klassen erzeugt. Bei dieser Demo wird die Beispieldatenbank Northwind von Microsoft eingesetzt. Daher wird der Name auf NorthwindModel vergeben.



Abb.1.3. – ADO.NET Entity Data Model erzeugen

Daraufhin wird ein Wizard angezeigt, womit „Generate from database“ ausgewählt wird, da ein Abbild von einer Datenbank erwünscht ist. Dann muss unter „New Connection“ die erwünschte Datenbank ausgewählt werden.



Abb.1.4. – Überblick der Datenbank verbindung

Als nächstes Zeigt und der Wizard alle Verfügbaren Funktionen der Datenbank an, die mit in das Model zur Verfügung gestellt werden können. Das wären: Tables, Views und Stored Procedures. Für diese Demo reichen Tabellen vollkommen aus.



Abb.1.5. – Nur Tabellen werden ausgewählt

Beim bestätigen auf „Finish“ wird vom Entity-Framework alles Nötige Generiert und eine Übersicht vom Model wird Grafisch im Designer-Modus dargestellt. Hier könnten nun weitere Einstellungen für das Model durchgenommen werden. Das kann allerdings auch jederzeit im Projekt, durch ein Doppelklick auf die Model-Datei ausgeübt werden.



Abb.1.6. – Entity-Model im Designer dargestellt

Jetzt wird der Designer geschlossen und zum Solution Explorer gewechselt. Dort ist nun unter dem Verzeichnis Model das Entity-Model NorthwindModel.edmx zu finden. Ein Blick auf die Code-Behind Datei NorthwindModel.Designer.cs unterhalb von NorthwindModel.edmx, zeigt die einzelnen Tabellen als Klasse abgebildet. Womit später ganz bequem darauf zugegriffen werden kann. Doch jetzt wird sich prämier auf das ADO.NET Data Service konzentriert.



Abb.1.7. – Code-Behind-Datei vom Entity-Model

Unsere Web-Service-Datenschicht: ADONETExample.WebDAL, benötigt nun das ADO.NET Data Service als neues Item. Dazu wird ein rechtsklick auf ADONETExample.WebDAL gemacht und auf New Item geklickt. Dort wählt man ADO.NET Data Service und vergeben den Namen: WebDataService.svc



Abb.1.8. – ADO.NET Data Service hinzufügen

Nach dem erzeugen des ADO.NET Data Services, öffnet sich der Source-Code. Hier werden einfachst durch Kommentare beschrieben, welche Schritte hier durchgeführt werden müssen. Als erstes müssen wir in den eckigen Klammern, bei der Basisklasse DataService unser Entity-Model überreichen. Also schreiben wir hier: NorthwindEntities. Damit NorthwindEntities auch vom Verzeichnis Model gefunden werden kann, darf das Using zum Namespace nicht vergessen werden: using ADONETExample.WebDAL.Model;



Abb.1.9. – Das Entity-Model dem ADO.NET Data Service bekannt machen.

Die nächste Aufgabe ist eine etwas aufwändigere Angelegenheit. Beim Instanziieren des Web-Services wird beim Konstruktor die Configuration übermittelt, womit hier noch einmal Manuell bestimmte Konfigurationen, wie zum Beispiel das Thema Sicherheit behandelt werden kann. Wichtig! Die Konfiguration benötigt eine Definition der Sicherheit. Daher müssen explizit für die Entities und den Services die Regeln definiert werden. Wir greifen auf den Parameter config zu und setzen für beide Methoden SetEntitySetAccessRule und SetServiceOperationAccessRule die Regeln fest. Nun muss erstens der Name des Entities zum Beispiel „Customer“ aus dem Entity-Model als String geschrieben werden. Doch für dieses Demo geben wir hier nur ein „*“ mit, das soviel bedeutet: „Diese Regel für ALLE Entities“. Danach kann eine explizite Regel dafür eingestellt werden mittels des enum EntitySetRights. Die Regeln die gesetzt werden können sind: Nur Lesen, Nur Schreiben, Kompletter Zugriff uvm. Hier wählen wir den Punkt: ALL.

Dieselbe Regelung definieren wir auch für die SetServiceOperationAccessRule, danach wäre unser ADO.NET Data Service fertig. Bei einem richtigen Unternehmensscenario muss auf jeden Fall genügend Zeit für die Sicherheitdefinition investiert werden, und sollte daher kein „*“ zum Einsatz kommen. Um ein besseres Bild zu bekommen, siehe Abb. 1.10.



Abb.1.10. – ADO.NET Data Service – Regeln für den Zugriff Definieren.

Der ADO.NET Data Service wäre Fertig! Um die REST Funktionalitäten zu testen, kann das Projekt mittels [F5]-Taste gestartet werden. Das Projekt wird gebuildet und der Web-Service im Browser gestartet. Es werden alle Tabellen aus unserem Entity-Model als XML dargestellt. Für die XML Darstellung verwendet das ADO.NET Data Service den allgemeinen Standard ATOM.



Abb.1.11. – Web-Service zeigt Tabellen als ATOM (XML) auf dem Browser an.

REST Funktionalität Testen

Um nun die ersten REST-Funktionalitäten über URL zu nutzen, muss beim Internet Explorer die automatisierte Anzeige von RSS-Feeds deaktiviert werden. Da ATOM ein Standard für Feeds bedacht war. Dazu muss man beim Internet Explorer unter Extras – Internetoptionen – Inhalte – (Feeds) Einstellungen. Dann den Hacken „Feedleseanzeige einschalten“ deaktivieren.



Abb.2.1. – Internet Explorer für REST-Test vorbereiten.

Als erstes soll der Inhalt der Tabelle „Customers“ angezeigt werden. Dazu erweitern wir die URL mit dem Namen „/Customers“. Nach dem bestätigen mit ENTER wird der Browser mit dem Inhalt von „Customers“ neugeladen.



Abb.2.2. – Tabelle „Customers“ mit REST abfragen.

Wenn nun ein einzelner Customer mit seiner ID angezeigt werden soll, muss dementsprechend in Klammern die ID übergeben werden. Geben wir einmal „/Customers('ALFKI')“ ein, um explizit diesen Benutzer zu sehen.



Abb.2.3. – Einzelne abfrage eines Customer mittels ID.

Die abfragen können beliebig nach Wunsch weitergeführt werden. Das besondere an unserem Web-Service ist, das keine Zeile Code für deren Funktionalität geschrieben werden musste. Bis auf das Definieren des Modells und die Konfiguration der Sicherheit.

Alle anderen Funktionalitäten, wie das Updaten, Löschen oder Erstellen, können mit Visual Studio Unterstützung einfachst in Clients verfügbar gemacht werden. Bei Projekten wie WPF oder Silverlight, übernimmt das Data-Binding diese eleganten Aufgaben.

Fazit

REST findet an seiner einfachen und fertigen Einsatzmöglichkeit an hoher Beliebtheit. Was mich persönlich total freut, ADO.NET Data Service ist nicht nur auf das Entity-Framework beschränkt! Eigene Modelle oder Modelle anderer O/R-Mapper wie NHibernate können gleichermaßen zum Einsatz kommen. Es muss nur ein Interface IUpdatable implementiert werden. Zugegeben, es gibt dann noch ein paar weitere Schritte die gemacht werden müssen, aber deren Aufwand ist nicht gleichzustellen, als wenn man eine Unit-of-Work-Lösung selbst schreiben müsste.

Immer mehr Projekte beginnen mit WPF- oder Silverlight-Clients. Deren Data-Binding Funktionalität mit ADO.NET Data Service enorm mächtig machen.



Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
kick it on dotnet-kicks.de

Kommentare

Powered by BlogEngine.NET 1.4.5.0
Theme by Extensive SEO

Über den Autor

Gregor Biswanger

Microsoft MVP für Client App Dev
XING

Gregor Biswanger (Microsoft MVP für Client App Dev) ist freier Consultant, Trainer, Autor und Speaker.


Seine Schwerpunkte liegen im Bereich der .NET-Architektur, agilen Prozessen und XAML. Er veröffentlichte vor kurzem seine DVD´s mit Video-Trainings zum Thema „Meine erste Windows 8 App“, „Windows Store Apps mit XAML und C#“ und „WPF 4.5 und Silverlight 5“ bei Addison-Wesley von video2brain.


Biswanger ist auch im Auftrag von Intel GmbH als Technologieberater für die Intel Developer Zone aktiv und ist Leader bei der Ingolstädter .NET Developers Group (INdotNET). 

 

Video über mich:
http://www.youtube.com/watch?v=mx_6SiiLxjk


Basta! 2011 Speaker

CLIPer

MCTS
Windows SharePoint Services 3.0 – Application Development (MCTS)