Artikel

Juni 2006 | Artikel

Das WM-Tippspiel des dot.net magazin

(Link zum Artikel: http://www.it-republik.de/dotnet/artikel/0848)

Über ein halbes Jahr Arbeit, zwischenzeitlich mehr als zehn Entwickler, unzählige Mails und schlaflose Nächte und das Ergebnis kann sich sehen lassen: Das Tippspiel hat es bis zur Fußballweltmeisterschaft geschafft.

Text: Andreas Gräfe, Jan Schuster & Team
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share
Das Warten hat sich gelohnt. Nach langer Entwicklungszeit mit allen Hochs und Tiefs hat das Team um Thomas Becker ein Tippspiel zur Fußballweltmeisterschaft erstellt.

Aufbau
Der Aufbau des WM-Tippspiels ist serviceorientiert. Es gibt verschiedene Komponenten, welche über diverse Nachrichtenkanäle, wie z.B. Web Services, Remoting und MSMQ kommunizieren - diese verbinden die einzelnen Bereiche der Anwendung miteinander. Die Kommunikation zwischen den Client-Anwendungen und dem Server wurde mit Web Services realisiert. Dabei handelt es sich um den TippService und den NewsService auf der Serverseite und den ReceiveService auf der Client-Seite. Der wichtigste und funktionsreichste Service ist der TippService. Dieser bietet Funktionalitäten für die Verwaltung von Spielen, Ergebnissen, Benutzern und deren Tipps sowie zusätzlicher Daten. Für die Datenhaltung wird die Objektdatenbank db4o [1] eingesetzt. Dadurch ist kein O/R Mapping oder gar ein Umsetzen der relationalen Strukturen in .NET-Objekte notwendig. Zur Präsentation der Daten werden drei Anwendungen eingesetzt. Als Hauptanwendung kommt eine ASP.NET-Webseite zum Einsatz - diese verwendet den TippService mit seinen vielfältigen Funktionen. Eine zweite Anwendung ist ein WinForms-Client, der DesktopTicker, hauptsächlich für das Darstellen der News und den persönlichen Tipps zuständig ist. Der DesktopTicker (Subscriber) registriert sich am Server (Publisher) für den Empfang von News und neuen Spielständen mit einer Rückrufadresse. Nun übernimmt der DesktopTicker die Rolle eines Servers, der unter dieser Adresse einen Web Service zur Verfügung stellt. Dieser Web Service wird jedoch nicht im IIS sondern in einer eigenen AppDomain der Anwendung durch einen System.Net.HttpListener (dank der großartigen Unterstützung durch Christian Weyer von thinktecture [5]) gehostet. Wenn sich nun ein Spielstand ändert, wird der DesktopTicker vom Server davon benachrichtigt und kann diese Information entsprechend anzeigen. Hier wurde das Observer-Pattern [2] eingesetzt, wodurch die technischen Details vor dem DesktopTicker versteckt worden sind. Eine dritte Anwendung ist der Administrator. Dieser nutzt vor allem die Verwaltungsfunktionen des TippService.

Tabelle 1: 16 Projektbausteine sollt ihr sein
Baustein Beschreibung
AdminWinConsole Eine WinForms-Anwendung, die zum Administrieren der Anwendung im Betrieb dient. Damit werden alle Inhalte gepflegt.
Common Um in allen Projekten eine einheitliche Vergabe von Versionsnummern zu ermöglichen, liegt hier die globale AssemblyInfo.cs und eine Datei, die die Versionsnummern hält.
DataTransferObjects Hier sind alle Objekte und Nachrichten vorhanden, die in der gesamten Anwendung ausgetauscht werden können.
Dnm 2006 FIFA Worldcup Desktop Ticker Die WinForms-Anwendung Desktop Ticker liegt in diesem Projekt vor.
DnmReceiverService ASMX-Service, der eine Schnittstelle für den Empfang von Nachrichten über neue Spielstände/News zu Verfügung stellt.
DNMWorldcupService Web Service für die wichtigsten Tipp-Spielfunktionen.
HttpListenerLibrary Kapselt System.Net.HttpListener .
MsmqGateway Kapselt den Zugriff auf MSMQ.
NewsReceiver Implementierung des NewsAbonnement für den Empfang von Nachrichten über neue Spielstände/News. Wendet das Observer -Pattern an.
NewsService Windows-Dienst, der Nachrichten über neue Spielstände/News versendet.
ServerBusinessLayer Implementiert die serverseitige Geschäftslogik und bietet Zugriff auf den DataAccessL a yer .
ServiceAccessLayer Bildet eine Fassade zwischen Client und Web Service. Mittels Factory können mehrere Services parallel angeboten werden. Hier ist auch der DummyProvider verankert.
Shared Objekte, die in der gesamten Solution benötigt werden, liegen hier vor. Dazu zählen zum Beispiel Exceptions und Patterns.
DataAccessLayer Kapselt den Datenbankzugriff.
SharedBusinessLogic Dieses Projekt bildet den Business-Layer im Client-Bereich.
TestConsole Erklärt sich fast von selbst. Das Testen ist eine der Hauptaufgaben bei der Programmierung gewesen.
Projektlebenslauf
November/Dezember 2005 In der Novemberausgabe des Jahres 2005 warb das dot.net magazin mit einem Artikel um die Teilnahme am Projekt „WM-Tippspiel“. Anfangs waren neben dem Team- und Projektleiter Thomas Becker vier weitere Entwickler beteiligt. Bei der Anmeldung konnte man seine Lieblingspositionen angeben - meistens wurden diese auch berücksichtigt. Durch leichte Kommunikationsprobleme und das nahende Weihnachten kam das Projekt im Jahr 2005 nicht richtig in Gang. Januar 2006 Die ersten Unternehmungen laufen an. Die Positionen sind weitgehend aufgeteilt. Zusätzlich melden sich auch noch zusätzliche Entwickler, die am Projekt teilnehmen möchten. Dies ist auch notwendig, da einige der Teammitglieder wieder absagen müssen. Am Ende des Monats pegelt sich die Projektgruppe bei acht Entwicklern ein. Die Entwicklung des Kontraktes des zentralen Web Service läuft an. Für bessere Kommunikation wird ein Projektportal mittels SharePoint Portal eingerichtet - dieses bietet Möglichkeiten für Diskussionen, Kontakt, Aufgabenvergabe, Link-Sammlung und ein Projektblog. Im Endeffekt hat sich aber die Kommunikation über Mail und Instant Messenger durchgesetzt. Februar 2006 Es ist immer noch Dynamik im Projektteam vorhanden. Durch die nahende BASTA! Spring Edition in Frankfurt/Mörfelden [3] bietet sich die Möglichkeit, erste persönliche Kontakte zu schließen. Durch die weite Verteilung aller Teammitglieder beschränkt sich das Treffen aber auf zwei Mitglieder - Thomas Becker und Andreas Gräfe. Hier wird der Kontrakt des Web Services festgesetzt und das weitere Vorgehen besprochen. Nun sind eigentlich alle Spielplätze belegt. Manche sind sogar mit zwei Entwicklern bemannt, wie z.B. das Mittelfeld mit Jan Schuster und Andreas Gräfe. Zum Ende des Monats wird die endgültige Architektur aller Komponenten festgelegt - nur im Bereich Datenbank gibt es noch Probleme. März 2006 Die Entwicklung des Middle Tier ist in vollem Gange. Zu den schon erstellten DataTransferObjects, die das Datenmodell darstellen, werden BusinessLayer, ServiceAccessLayer und Web Service erstellt. Der ServiceAccessLayer ist auf der Client-Seite angesiedelt und dient als Factory. Im ServiceAccessLayer sind zwei Provider implementiert. Der ServiceProvider greift die Daten direkt vom Web Service ab. Der DummyProvider wird zum Testen des Interfaces und der Datenstruktur eingesetzt. Somit können die Client-Entwickler sofort gegen den ServiceAccessLayer programmieren, ohne dass der Backend-Bereich fertig gestellt ist. Dies ermöglicht eine weitestgehend parallele Entwicklung des Systems. Mit weiteren Zugängen im Projektteam wird nun auch die Idee vom Desktopticker als WindowsForms-Projekt umgesetzt.
April 2006 Kleinere Wechselspiele im hinteren Spielfeldbereich verzögern die Entwicklung des DataAccessLayers, der im Backend für die Datenbankzugriffe verantwortlich ist. Da es nur noch wenige Tage bis zur WM sind, wird aber an allen Teilen fleißig gearbeitet. So entsteht im Webbereich eine Karte mit allen Spielorten und deren Spielen - dies wird mittels Microsoft Virtual Earth [4] realisiert. Die Clients verlangen auch immer mehr Informationen aus dem Middle Tier. Mit der Programmierung gegen die Schnittstelle des ServiceAccessLayers ist der Aufwand aber relativ gering. Durch den DummyProvider können auch Tests und Integrationsprüfungen durchgeführt werden.
Mai 2006 Das Backend ist weitestgehend fertig. Nun werden Code Reviews durchgeführt, um unsaubere Codestellen zu bereinigen. Der Administrator-Client entsteht als WinForm-Anwendung. Der DataAccessLayer wird in die Anwendung eingebunden und das Testen mit Echtdaten kann beginnen. Zum Ende hin müssen die Vorabinformationen wie Mannschaften, Spieler, Stadien und Vorrundenspiele eingearbeitet werden. Nach dem Rollout der Anwendung steht der Weltmeisterschaft auch seitens des Tippspiels nichts mehr im Wege.
Juni 2006 Der Echtbetrieb läuft an. Da der Artikel vor der WM erstellt wurde, können wir nur hoffen, dass die Anwendung gut angenommen wird und Freude bei der Benutzung bereitet.
Details der einzelnen Komponenten
Durch den Einsatz der Objektdatenbank db4objects war von Anfang an klar, dass dieses Projekt in neue Gefilde der Software-Entwicklung vordringen soll. Natürlich bestand auch die Möglichkeit auf den SQL Server 2005 zu setzen. Ein Referenzprojekt sollte aber nicht an altbewährten Technologien festhalten - im Nachhinein können wir das nur bestätigen. Im Middle Tier war die Vorgehensweise auch sehr schnell geklärt: Contract First lautete das Zauberwort. Als Modellierungssprache für die Datenobjekte entschieden wir uns für XML-Schema. In einem längeren Entwicklungsprozess entstanden die benötigten Datenobjekte, die anschließend für die Modellierung der Nachrichten Anwendung fanden. Die Erstellung der Schemas bildete einen großen Anteil an der Gesamtarbeit. Bis zu diesem Zeitpunkt wurde noch keine Zeile C#-Quellcode geschrieben. Nun mussten wir uns entscheiden, welches Tool wir für die Generierung der Datenobjekte und Nachrichten als .NET-Klassen, Schnittstellen usw. verwenden. Zur Auswahl standen hier das Tool xsd.exe aus dem SDK oder das Tool WSCF von thinktecture [5]. Hier kam die BASTA! 2005 Spring Edition genau richtig - Christian Weyer von thinktecture überließ uns auf der BASTA! die neue Version seines Tools. Dadurch konnten wir schon drei Wochen vor dem Release mit der Version WSCF 0.6 experimentieren. Im Vergleich mit xsd.exe glänzte dieses Tool vor allem durch seine Benutzerfreundlichkeit. Auch Ralf Westphal [6] hat uns ein Geschenk zur BASTA! gemacht - von ihm haben wir die Präsentationsvorlage für die Darstellung als Software-Zellen erhalten. Nun aber zum Aufbau - Abbildung 5 zeigt sehr schön das Zusammenspiel der einzelnen Komponenten.
Im Zentrum des Middle Tiers steht der Web Service. Das Grundgerüst wurde ebenfalls mit dem Tool WSCF generiert. Der Web Service ist als Fassade für den Zugriff auf die Geschäftslogik implementiert worden. Wir haben uns für eine statuslose Implementierung entschieden. Das führte zu einer Implementierung von statischen Geschäftsklassen. Diese Klassen kapseln die gesamte benötigte Geschäftslogik für das Tippspiel. Dort werden beispielsweise die Punktestände der Spieler oder der Spielplan berechnet. Hier wurde auch ein rollenbasierter Zugriff mithilfe von standardmäßigen .NET-Mechanismen (IIdenty und IPrincipal) attributiert (PrincipalPermission) realisiert. Aus technischer Neugierde wurde der Entschluss gefasst, einen Service zu implementieren, der aktiv Nachrichten an registrierte Benutzer versenden kann. Um einen robusten Betrieb zu garantieren, wurde ein Windows-Dienst entwickelt, der diese Nachrichten verteilt. Die Kommunikation zwischen Geschäftslogik und Windows-Dienst wurde über MSMQ realisiert. Die Nachrichten werden über einen clientseitig gehosteten Web Service empfangen. Die drei Anwendungen im Client-Bereich stellen nun alle Funktionen des Middle Tier zur Verfügung. Der DesktopTicker verwendet zum Darstellen der Nachrichten den NewsReceiver. Für alle anderen Funktionen wie An- und Abmelden dient der ServiceAccessLayer. Dieser ist auch die Hauptschnittstelle für den Webclient und das Admintool. Der Webclient folgt dem MVC-Pattern [8]. Zur Datenbindung wird die neue ObjectDataSource verwendet. Dadurch können auch alle gebundenen Steuerelemente wie GridView oder Repeater komfortabel verwendet werden.
Fazit
Abschließend können wir nur sagen, dass es eine sehr interessante Erfahrung war, in einer lockeren Gemeinschaft ein Projekt dieser Größe zu erstellen. Auch wenn nicht immer alles ohne Probleme ging, würden wir sofort wieder ein neues Projekt anfangen. So einfach lässt sich eine Community aufbauen - zum Glück ist in zwei Jahren Europameisterschaft.
Links & Literatur


Anzeige

Kommentare

zurück zum Seitenanfang