HowTo: Microsoft p&p – Web Service Factory / Service Factory (Teil 3: Praktisches "Hello World")

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:

- GAT / GAX sowie natテシrlich Visual Studio 2005
- Service Factory
- Microsoft SQL Server (Express reicht aus)
- Microsoft SQL Server Management Studio

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テ歹rst 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

Letzte Posts

  • image.png
    Azure AppInsights: Ein mini Google Analytics für Websites

    Seit der Build Konferenz ist das neue Azure Portal fテシr alle freigeschaltet. Durch das neue Portal ist mir ein 窶廛ienst窶 aufgefallen, den ich bisher nicht gesehen hatte: Azure Application Insights Viel weiss ich nicht テシber den Dienst, aber wer eine Azure Website hat der sollte mal die 窶廣nalytics窶 Box テカffnen. Im Grunde handelt es sich […]

  • image.png
    Source Code veröffentlichen – aber bitte mit Lizenz

    Seit es den Blog gibt wird auch meist der gesamte Demo Source Code mit verテカffentlicht. Das Ganze hatte ich am Anfang noch als .zip verteilt, spテ、ter lag es mal auf Google Code und nun liegen alle Samples und sonstige Sachen auf GitHub. Beim letzten User Group Treffen in Zテシrich mit dem Titel 窶廾pen Source: Get […]

  • Fix: Cannot convert from ‘CConnectProxy::_ComMapClass *’ to ‘AddInDesignerObjects::IDTExtensibility2 *’

    Mal einen etwas esoterischer Blogpost, welcher auftaucht wenn man zu viel mit Office Addins rumspielt. Der Fehler passiert beim Bauen von C++ Projekten, welchen diesen Typ benテカtigen. Lテカsung (auf 64bit Systemen): C:\Program Files (x86)\Common Files\DESIGNER>regsvr32 MSADDNDR.DLL And Rebuild. Meine lieben Kollegen hatte mir dies schon mehrfach gesagt, allerdings hatte ich es immer wieder vergessen Das […]

  • Gegen das Gesetz verstoßen: X Jahre Haft. Gegen die Terms of Use verstoßen: Bann auf Lebenszeit. Danke Google & co.

    Bei fast allen Diensten die man im Internet nutzen kann muss man den 窶弋erms of use窶 zustimmen. Vテカllig logisch dass da natテシrlich drin steht was erlaubt und was nicht. Wenn man gegen diese Regelungen verstテカテ殳 hat das Unternehmen natテシrlich das Recht etwas dagegen zu unternehmen. In der heutigen Welt beherrschen einige wenige Unternehmen die digitale […]

  • image.png
    RSS Feed samt Kommentaranzahl und andere nicht Standard Elemente mit dem SyndicationFeed auslesen

    Jetzt mal ein Blogpost ohne ein fancy NuGet Package: Seit .NET 3.5 gibt es die SyndicationFeed Klasse. Eine schon etwas テ、ltere API, reicht aber aus um Atom bzw. RSS Feeds zu lesen. In diversen RSS Feeds gibt es aber Erweiterungen, welche man natテシrlich auch auslesen mテカchte. So gibt WordPress z.B. auch die Anzahl der geposteten […]

Support us!