April 2016 tot januari 2017 - Het bouwen van een vervanging voor een bestaand dataverwerkingssysteem dat gebouwd was in Integration Services van Microsoft SQL Server. Het systeem moet grote hoeveelheden data kunnen verwerken van platte tabellen naar een stervormig datamodel ten behoeve van marketing en rapportage.

Tags:
C#.NET - SQL Server - XML - Generic Classes - Dependency Injection - Automapper - Data optimaal programmeren

Situatie

De opdrachtgever heeft een systeem geërfd dat gebouwd is in bovengenoemd systeem dat dagelijks grote hoeveelheden data verwerkt dat aangeleverd wordt in databases of XML bestanden. Het platform waarop gebouwd is maakt het onmogelijk om de kwaliteit van de code te verhogen op het gebied van testbaarheid en herbruikbaarheid (DRY). Kleine wijzigingen in het systeem leiden dikwijls tot fouten doordat dezelfde data structuren veelvoudig in het systeem voorkomen zonder gerelateerd te zijn of te kunnen zijn.

Taken

Het bouwen van een systeem in C#.NET dat vergelijkbaar is met het oude systeem voor wat betreft overzichtelijkheid in control- en dataflows. Verder moet het systeem eenvoudig aanpasbaar en uitbreidbaar zijn zodat bijvoorbeeld, wanneer er een kolom wordt gewijzigd of toegevoegd, de ontwikkelaar vanzelf wordt gewezen op de plaatsen waar een aanpassing moet worden doorgevoerd. Verder moet de snelheid van het systeem vergelijkbaar of beter zijn dan het oude. Het systeem moet zo veel mogelijk worden voorzien van unit tests.

Aanpak

Eerst heb ik een aantal componenten gebouwd die soortgelijke taken uitvoeren als de meest gangbare componenten in Integration Services, zoals data bronnen en bestemmingen, lookup, split en merge. Deze classes zijn allemaal generic zodat er altijd strong-typed gewerkt kan worden. Vervolgens heb ik een gelaagd systeem gebouwd waarbij de data wordt gemapt middels interfaces en Automapper. De database toegang wordt middels Dependency Injection gekoppeld zodat voor de tests niet altijd databases nodig zijn. Door middel van tests op de Automapper configuratie wordt gevalideerd of alle velden van bron en doel zijn opgenomen in het systeem.

Resultaat

Het systeem dat nu draait werkt beter dan het oude omdat het in staat is met grotere hoeveelheden data te werken. De code is goed en volledig testbaar zonder het product eerst te hoeven installeren of afhankelijk te zijn van de inhoud van een database. Dit is een grote verbetering omdat de tests zo altijd dezelfde uitkomst hebben. Het aanbrengen van wijzigingen in het systeem gaat sneller en het resultaat is nu goed te valideren.