DigiFlow begann als Schulprojekt im Modul 295 und wurde zu einer vollständigen Webanwendung für Projektverwaltung. Der Weg von der ersten Idee bis zum Live-Deployment auf Render hat mir mehr über Software Engineering beigebracht als jedes Tutorial.
Die Ausgangslage
Die Aufgabe im Modul 295 war klar: Eine Backend-Anwendung planen, entwickeln, testen und deployen. Ich wollte über das Minimum hinausgehen und eine Anwendung bauen, die ich selbst benutzen würde.
DigiFlow sollte Teams helfen, ihre digitalen Projekte zu verwalten -- mit Authentifizierung, Datenexport und einer sauberen Benutzeroberfläche.
Tech-Stack Entscheidung
Warum C# mit Blazor? Drei Gründe:
- Full-Stack mit einer Sprache -- C# für Backend und Frontend, kein Context-Switch
- Entity Framework -- ORM mit Migrations, spart enorm Zeit bei Datenbankänderungen
- .NET-Ökosystem -- Dependency Injection, Middleware, Authentication sind built-in
Für die Datenbank habe ich SQLite gewählt -- leichtgewichtig, ideal für Prototyping und einfach auf Render zu deployen.
Architektur
Die Anwendung folgt dem Clean Architecture Pattern:
- Domain Layer -- Entities und Business Logic
- Application Layer -- Services, DTOs, Interfaces
- Infrastructure Layer -- Entity Framework, externe APIs
- Presentation Layer -- Blazor Server Components
Diese Trennung hat sich bezahlt gemacht, als ich die Datenbank-Migration von SQL Server auf SQLite durchführen musste -- nur der Infrastructure Layer war betroffen.
Features im Detail
Authentifizierung
Ich habe ASP.NET Identity implementiert mit Cookie-basierter Session-Verwaltung. Login, Registrierung und Passwort-Reset -- alles mit den built-in Security-Features von .NET.
Projektverwaltung
CRUD-Operationen für Projekte, Aufgaben und Teammitglieder. Jedes Projekt hat einen Status-Workflow (Entwurf → Aktiv → Abgeschlossen), der mit State Machine Pattern umgesetzt ist.
Datenexport
Export als CSV und PDF. Der PDF-Generator nutzt eine Template-Engine, die dynamisch Tabellen und Charts rendert. Ein Feature, das ich zuerst für unnötig hielt -- bis ich es selbst brauchte.
Deployment auf Render
Das Deployment war die grösste Herausforderung. Render unterstützt .NET-Apps, aber die Konfiguration erfordert einige Tricks:
- Docker-Container mit Multi-Stage Build für kleine Image-Grösse
- Environment Variables für Connection Strings und Secrets
- Health Checks, damit Render weiss, wann die App bereit ist
- Persistenter Storage für die SQLite-Datenbank
Lessons Learned
- Migrations planen -- Datenbankänderungen müssen vorwärts- und rückwärtskompatibel sein
- Error Handling zentralisieren -- Ein globaler Exception Handler spart Hunderte try-catch-Blöcke
- Deployment von Tag 1 -- Ich hätte von Anfang an auf Render deployen sollen, nicht erst am Ende
- Logging ist kein Luxus -- Structured Logging mit Serilog hat mir beim Debugging in Production Stunden gespart