In den letzten Beiden (Teil 1, Teil 2 (und dem “Grundkurs für Software Factories”)) ging es um die Grundlagen und um die HOLs - jetzt setzen wir das mal selber um. Ich werde das hier alles Schritt für Schritt zeigen und erklären - diesmal wirds sehr Bilderreich.
Das Szenario: Ich möchte nur einen sehr einfachen Webservice erstellen - eine Art “Hello World” Beispiel. Wir möchten ein Buzzword (oder in Fachkreisen auch Bull***t) Katalog anfertigen.
Vorbereitung:
Schritt 1: MS SQL Datenbank erstellen
Wir verbinden uns zur MS SQL (Express) Datenbank und lassen die Standardwerte. Zu Beachten ist: Das Microsoft SQL Server Management Studio sollte mit Administratorrechten laufen, sonst kommt es beim Anlegen der DB zu einem Fehler!
Dannach legen wir eine neue Datenbank an…
… und benennen diese “Buzzword” und lassen die restlichen Standardparameter und Optionen so.
Dannach legen wir uns eine neue Tabelle an…
welche zwei Spalten hat:
… und benennen diese “buzzwords”.
Schritt 2: Service Factory Projekt anlegen
Im Visual Studio erstellen wir jetzt unser “BlogPosts.Buzzwords” Projekt. Beachtet: Bitte mit Administrator Rechten ausführen!
Die Solution Properties lassen wir ebenso…
… und schon haben wir unsere Projektstruktur:
Schritt 3: DB Verbindungsdaten hinterlegen
Um die Database Connection zu hinterlegen, gehen wir auf die Service Factory (Data Access) Eigentschaften des Hosts.
Geben dort als Connection Name “Buzzwords” ein und wählen den MS SQL Server als Datenquelle…
… und stellen unsere Verbindungseinstellungen ein.
Schritt 4: BusinessEntities erzeugen
Also nächstes wollen wir direkt eine Klasse anhand der DB Struktur erstellen, also auf die BusinessEntities und dann “Create business entities from database”.
Das Hostprojekt und den passenden Connection name wählen…
… unsere Tabelle auswählen…
… und aus dem aus der DB stammenden “buzzwords” ein “Buzzword” machen - sieht im .NET Code schöner aus.
Resultat:
Schritt 5: In der Data Access CRUD Befehle erstellen
Um die Datenbank auch mit Daten zu befüttern kann man direkt CRUD Befehle erstellen: Create/Read/Update/Delete.
Dazu werden stored procedures erstellt…
… welche man am Ende als SQL File in dem Projektordner wieder sieht.
Dies kann man nun per Kommandozeile oder per SQL Studio machen:
Einfach das SQL reinkopieren und ausführen, als Ergebniss erhält man alle Stored Procedures:
Schritt 6: Data Repository Klassen erschaffen
Um die Daten auch abzurufen, muss man Data Repository Klassen erstellen, dabei werden diese Anhand der Business Entities geniert.
Man selber wählt anhand der Stored Procedur ein Mapping zu den Entities (wie in dem Screenshot zu sehen).
Resultat:
Schritt 7: BusinessLogic erschaffen
Die BusinessLogic ist das Bindeglied zwischen dem was man machen will und den Repository Klassen. Dieser Code muss per Hand geschrieben werden - ist aber nicht viel, da das meiste bereits die anderen Klassen machen.
Beispielcode aus dem BuzzwordListManager:
class BuzzwordListManager { public List<Buzzword> Load() { BuzzwordRepository rep = new BuzzwordRepository(“Buzzword”); List<Buzzword> result = rep.GetAllFrombuzzwords(); if (result == null) { // Not found throw new NotImplementedException(); } return result; } }
Resultat:
Schritt 8: Service - DataContract erschaffen
Jetzt kommen wir zu der Service Interface Schicht. DataContracts sind im Prinzip wieder Klassen, welche der Webservice entweder als Request oder als Response weitergibt. Dadurch muss man nicht seine eigene BusinessLogic veröffentlichen oder ist bei Änderungen der jeweiligen Seite nicht so abhängig.
Das Anlegen der Members geht über solch ein Grid, als Typen können die allgemeinen .NET Klassen genommen werden, aber auch andere DataContract Klassen. Die Klassen können auch kombiniert werden. Es gibt auch noch mehr Varianten, dies ist aber am Besten nachzulesen in der Hilfe.
Resultat:
Schritt 9: Service - ServiceContract erschaffen
Nachdem wir jetzt die Members des Service definiert haben, gilt es nun daran zu definieren, welche Schnittstellen der Service überhaupt haben soll.
Hier legt man ein Namen für das Interface fest, sowie der XML namespace etc.
Dannach definiert man die Operationen mit den Requests und den Response Objekten.
Resultat:
Schritt 10: Service - ServiceImplementation - Mapping des DataContracts auf die BusinessEntities
Nun kommen wir zum nächsten Punkt: Die Contracts sind soweit fertig, die BusinessLogic & Entities ebenfalls - allerdings fehlt noch das Mapping dazwischen: Dazu gibts Contract Translators.
Ein kleiner Fehler gibt es in dem Interface, welches aber bekannt ist: Die Eingabefelder für das Mapping sind grau unterlegt, allerdings einfach mit der Maus auf das Feld klicken und dann Enter oder Leertaste drücken - schon kommt man zum Auswahlmenü.
Hier wählt man nun zwei Klassen aus, welche man mappen möchte. In unserem Fall ist das natürlich sehr einfach:
Im Anschluss erfolgt das Mapping der einzelnen Properties und eine TranslateBetweenXXXAndYYY entsteht.
Resultat:
Schritt 11: Service - ServiceImplementation
Jetzt kommen wir zum Hauptteil - und noch etwas Schreibarbeit: Die Implementation des ganzen.
Dabei implementiert man den ServiceContract, welcher als Request / Response die Teile aus dem DataContract nimmt. In der Implementation greift man auf den Translator zu, damit man die BusinessLogic nutzen kann.
Beispielcode aus dem BuzzwordService:
public void Insert(BlogPosts.Buzzwords.DataContracts.Buzzword request) { Buzzword BuzzwordEntity = TranslateBetweenBuzzwordAndBuzzword.TranslateBuzzwordToBuzzword(request); BuzzwordManager Manager = new BuzzwordManager(); Manager.Insert(BuzzwordEntity); }
Resultat:
Schritt 12: Service veröffentlichen
Als Abschluss veröffentlicht man den Service in der Host Anwendung.
Dabei kann man noch verschiedene Optionen treffen - hier mal ein Basic Web Service.
Ebenfalls die Metadaten mit anklicken und das Ergebnis ist ein XXX.svc Datei.
Resultat:
Schritt 13: Testen des Services
Wenn man diese svc Datei nun im Browser anschaut, sieht man in der Mitte die WSDL des Webservice.
Diese WSDL kann entweder über das Programm getestet werden, oder…
… wir binden dies ganz einfach in ein Projekt ein:
Der Service implementiert momentan nur eine Load und Insert Methode - aufgrund der vorangeschrittenen Zeit werde ich dies als Beispiel zwar als Download anbieten, garantiere aber für nichts ;)
Testcode:
localhost.BuzzwordService Service = new BlogPosts.Buzzwords.Client.localhost.BuzzwordService(); localhost.Buzzword request = new BlogPosts.Buzzwords.Client.localhost.Buzzword(); request.Name = “Web 2.0”; Service.Insert(request);
Resultat:
Jedenfalls der Testaufruf hat funktioniert - und das alles ohne viel Schreibarbeit.
Fazit: Dieser Service ist natürlich äußerst einfach gestrickt und dieses HowTo sollte einen ersten Einblick gewähren, aber bereits während der Entwicklung dieses Services ging es sehr schnell voran. Sobald man erstmal sich überwunden hat, macht es weit weniger Aufwand als alles selber zu erstellen. Wem die Wizards nicht gefallen, der kann sie entweder anpassen - oder auch alles manuell erstellen. In der Hilfe (direkt auf der Codeplex Seite ist das CHM File) ist dies neben der automatischen Generierung gut beschrieben. Das heisst, man ist hier nicht auf irgendwelche “Hintergrund-Magie” angewiesen, sondern die Service Factory bietet eine sehr gute Unterstützung.
Download:
[DemoCode - DB Connection muss natürlich angepasst werden]
Links:
Blog Software Factories verstehen Service Factory - Teil 1 (Grundlagen & ASMX Variante) Service Factory - Teil 2 (WCF Variante) Service Factory HOLs @ Codeplex
Software Visual Studio 2005 GAT / GAX Service Factory Service Factory @ Codeplex SQL Server 2005 SQL Server 2005 Management Studio