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!

image

Dannach legen wir eine neue Datenbank an…

image

image

… und benennen diese “Buzzword” und lassen die restlichen Standardparameter und Optionen so.

image

Dannach legen wir uns eine neue Tabelle an…

image

image

welche zwei Spalten hat:

  • id: int (NULL nicht zulassen & Primärschlüssel & als ID festlegen) - einfache Zählvariable
  • name: nvchar(50) (NULL NICHT zulassen!) - das wird unser Lagerort für unser Wörter ;)

image

… 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!

image

Die Solution Properties lassen wir ebenso…

image

… und schon haben wir unsere Projektstruktur:

image

Schritt 3: DB Verbindungsdaten hinterlegen

Um die Database Connection zu hinterlegen, gehen wir auf die Service Factory (Data Access) Eigentschaften des Hosts.

image

Geben dort als Connection Name “Buzzwords” ein und wählen den MS SQL Server als Datenquelle…

image

… und stellen unsere Verbindungseinstellungen ein.

image 

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”.

image

Das Hostprojekt und den passenden Connection name wählen…

image

… unsere Tabelle auswählen…

image

… und aus dem aus der DB stammenden “buzzwords” ein “Buzzword” machen - sieht im .NET Code schöner aus.

image

Resultat:

image

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.

image

Dazu werden stored procedures erstellt… 

image

… welche man am Ende als SQL File in dem Projektordner wieder sieht.

image

 Dies kann man nun per Kommandozeile oder per SQL Studio machen:

image

Einfach das SQL reinkopieren und ausführen, als Ergebniss erhält man alle Stored Procedures:

image

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.

image

Man selber wählt anhand der Stored Procedur ein Mapping zu den Entities (wie in dem Screenshot zu sehen). 

image

Resultat:

image 

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:

image

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.

image

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.

image

Resultat:

image

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.

image

Hier legt man ein Namen für das Interface fest, sowie der XML namespace etc.

image

Dannach definiert man die Operationen mit den Requests und den Response Objekten.

image

Resultat:

image

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.

image

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ü.

image

Hier wählt man nun zwei Klassen aus, welche man mappen möchte. In unserem Fall ist das natürlich sehr einfach:

image

Im Anschluss erfolgt das Mapping der einzelnen Properties und eine TranslateBetweenXXXAndYYY entsteht.

image

Resultat:

image

Schritt 11: Service - ServiceImplementation

Jetzt kommen wir zum Hauptteil - und noch etwas Schreibarbeit: Die Implementation des ganzen.

image

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:

image

Schritt 12: Service veröffentlichen

Als Abschluss veröffentlicht man den Service in der Host Anwendung.

image 

Dabei kann man noch verschiedene Optionen treffen - hier mal ein Basic Web Service.

image

Ebenfalls die Metadaten mit anklicken und das Ergebnis ist ein XXX.svc Datei.

Resultat:

image

Schritt 13: Testen des Services

Wenn man diese svc Datei nun im Browser anschaut, sieht man in der Mitte die WSDL des Webservice.

image

Diese WSDL kann entweder über das Programm getestet werden, oder…

image

… wir binden dies ganz einfach in ein Projekt ein:

image

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:

image

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