Gedanken zum Service Layer

Nach wie vor bin ich Pragmatiker. Ich werde nichts reindichten, aufpfropfen interpretieren. Ich habs gern einfach direkt und die Welt muss schöner werden jetzt und nicht erst in vielen Jahren.

Mein Problem ist die Prometric Website und deren Funktion “Suche ein Test Center um eine Microsoft Prüfung abzulegen”. Braucht man um MCSD oder MCSE zu werden. Die Suche auf Prometric ist grottig. Man und damit ich muss durch die 240 Microsoft Certified Exam Provider durchblättern. Ist nicht mal nach Ort sortierbar.

image

Also da muss Maps Integration her. So sieht das Ergebnis aus (natürlich bing und nicht google). Rechts kann man in allen deutschen Prüfungszentren per Postleitzahl suchen.

http://www.ppedv.de/prometric/prometrictestcenter.aspx

image

Es werden drei Dienste benötigt:

1) Kartenanzeige

2) Testcenter suchen

3) PLZ in Koordinaten umrechnen

Solche Dienste sind für mich nichts anderes als eine DLL oder ein Assembly. Ich rufe eine Methode auf und bekomme was zurück. Um in Zeiten von PRISM niemand zu viel Information in die Hand zu geben, verteile ich die Services auf verschiedene Anbieter. Für #1 nehme ich BING, für #2 eine eigene Datenbasis und für #3 habe ich zunächst einen weiteren Kartendienst bemüht. Da Fremdservices nicht unter meiner Kontrolle stehen und unter Umständen zu viel Daten liefern, eventuell einen Security Token benötigen und aus tausend weiteren Gründen habe ich den Service gekapselt.

http://www.ppedv.de/api/location/84489

So sieht eine Website aus, für die der Key nicht erneuert wurde

image

Der erste Ansatz war also Aufruf eines ASP.NET Web Api Services auf unserem IIS und der holt sich vom anderen Service die Daten. Wenn ich weiter drüber nachdenke, gibt es in Deutschland je nach Betrachtung 30-50tausend PLZ Ort Kombis. Ich habe mich entschieden die Daten auf unseren Server zu lagern. Damit reduziert sich die Komplexität.

Als nächstes die Frage, wie halte diese nun exakt 55000 Datensätze (PLZ,Ort, Geokoordinaten). Datenbank, Datei, Json serialisiert? Dateigröße ist 1,6 MB. Ich erwarte nicht viele Request um ein Testcenter zu suchen. In Deutschland werden jährlich rund 10.000 Prüfungen abgelegt. Die meisten Menschen werden zum Anbieter ihres Vertrauens gehen.

Also lege ich die Daten als csv ins APP_DATA Verzeichnis. Dort sind sie vor Download automatisch geschützt. CSV Dateien sind am schnellsten zu parsen und erzeugen mit einem per Line Read auch keinen Memory Overhead. Falls es mal mehr Zugriffe werden sollten habe ich vor Data Caching einzusetzen. Sind dann max. zehn Zeilen Code die man einfügen muss.

Da eine Website per View HTML Source ohnehin für jeden Reveres Engineerbar ist, hier auch noch der Service, der  Testcenter im Umkreis von 50km liefert.

http://www.ppedv.de/api/prometric/48,1697319-12,8305939

Die Herausforderung dazu war, die Umkreissuche per LINQ Statement. Also die Entfernung  anhand von Geocordinaten berechnen. Es gibt wohl in System.Devices.location eine entsprechende Klasse, die sich aber in ASP.NET nicht referenzieren lässt. Auch Entity Framework 5 kann DBgeography um eine Distance am besten gleich im SQL Server zu berechnen. Ich hab mich für Code Klau entschieden.

   1:    Public Function distance_calculate(lat1 As Double, lon1 As Double, lat2 As Double, 
lon2 As Double, unit As Char) As Double
   2:   
   3:          Dim theta As Double = lon1 - lon2
   4:          Dim dist As Double = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + 
Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta))
   5:          dist = Math.Acos(dist)
   6:          dist = rad2deg(dist)
   7:          dist = dist * 60 * 1.1515
   8:          If Double.IsNaN(dist) Then dist = 0
   9:          If unit = "K"c Then
  10:              dist = dist * 1.6093440000000001
  11:          ElseIf unit = "N"c Then
  12:              dist = dist * 0.86839999999999995
  13:          End If
  14:         
  15:   
  16:          Return (dist)
  17:      End Function
  18:      Private Shared Function deg2rad(deg As Double) As Double
  19:          Return (deg * Math.PI / 180.0)
  20:      End Function
  21:      Private Shared Function rad2deg(rad As Double) As Double
  22:          Return (rad / Math.PI * 180.0)
  23:      End Function

Was sehe ich nun als Probleme bei Diensten von Fremdanbietern

  • Kein garantierten QoS
  • Security Tokens laufen ab
  • Datenformate ändern sich
  • Datenschutz
  • Sicherheitsprobleme
  • Abhängigkeiten und höhere Komplexität

Wenn man die ganzen APP’s so ansieht, bauen die aber ganz wesentlich auf Dritt-Anbieter Dienste. Ich habe so ein Gefühl- das wird noch lustig. (Ironie)

Kommentare sind geschlossen