Wie bereits beim Blog-Eintrag genannt wurde: „ADO.NET Data
Services - Der REST Anbieter für Modelle“, können auch mit anderen O/R-Mapper
oder Datenquellen als Model für die Data Services eingesetzt werden. Dieser
Artikel soll Demonstrieren, wie einfach NHibernate verwendet werden kann.
Vorkenntnisse über den bisherigen Artikel zu ADO.NET Data Services und
NHibernate wären Voraussetzung.
Die Datenschicht
Beginnend bei der Datenschicht, wird NHibernate wie gewohnt
eingesetzt. Dazu zählen die beiden Konfigurationsdateien hibernate.cfg.xml (Alle Hauptsächlichen Einstellungen wie der
Data-Provider und Connection-String) und Customer.hbm.xml
(Konfigurationsdatei zum Mappen der Entity Customer). Weil NHibernate´s wichtigsten
Kernfunktionen wie ISessionFactory
und ISession nicht Thread-Safe sind.
Wird eine NHibernateHelper-Klasse geschrieben um mehrere Instancen verhindern
zu können.
Abb.1.1. – Aufbau der Datenschicht.
Zu guter Letzt folgt die CustomerReposity-Klasse, die den
direkten Zugriff auf die Customer in der Datenbank hat. Diese benötigt eine
Statische-Methode, die ein Objekt zurück gibt, das von IQueryable ableitet,
diese stellt Funktionen zur Auswertung von Abfragen für eine spezifische
Datenquelle mit unbekanntem Datentyp bereit und kommt aus dem Namespace
System.Linq. Passend dazu muss mittels Generics der Typ der Entity mitgegeben
werden. Bei der Verwendung von LINQ-to-NHibernate kann nach der Abfrage das Ergebnis
als Liste konvertiert werden, erst dann kann LINQ-to-NHibernate „richtig“ zu
AsQueryable konvertieren. Eventuell ist das noch ein Bug von der
LINQ-to-NHibernate Version 1.0.
Abb.1.2. – Source-Code von
CustomerRepository.
Die DataService-Schicht
Für die DataService-Schicht wird nun eine Modell-Klasse zur
Verfügung gestellt. Dieses Modell ist direkt mit dem CustomerRepository
verbunden.
Abb.1.3. – Aufbau der
DataService-Schicht.
Um Lesend die Daten von der Datenschicht zu erhalten, wird
wiederholt eine Methode mit dem Rückgabeobjekt IQueryable geschrieben. Allerdings möchte man ja auch Daten
schreiben oder ändern können. Dazu muss ein Interface mit IUpdatable dem Modell implementiert werden. Das Interface selbst
hat einige Methoden, doch um nur die Aktualisierung der Daten zu ermöglichen
langen die folgenden Methoden GetResource, SetValue und ResolveResource.
Abb.1.4. – Source-Code von
CustomerModel.
Nun wird dem Data Service das CustomerModel zugewiesen.
Abb.1.5. – Dem Data Service
„WebDataService“ das CustomerModel zuweisen.
Jetzt ist auch der ADO.NET Data Service mit NHibernate
fertig. Beim Starten des Projekts kann nun alles mittels REST angesteuert
werden. Auch das einbinden auf einem Client und ansteuern mittels LINQ ist nun
möglich. Wie das funktioniert, wurde bereits unter diesem Artikel beschrieben:
„LINQ-to-Data Service - LINQ den REST geben“.
Abb.1.6. – Der fertige
Data-Service im Browser.
Fazit
Leider ist es natürlich nicht so elegant und schnell gelöst,
als wäre dies mit dem Entity Framework zu Verfügung gestellt worden. Allerdings
ist es auch nicht so komplex und schwierig. Meist wird ja mehr als ein REST
Services benötigt und dann kann man „der Architektur zur Liebe“ ohne schlechtem
Gewissen mit NHibernate arbeiten.
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
