WarehouseWizard
WinForms-Lagerverwaltung mit sauberer Schichtenarchitektur
Desktop-Anwendung zur Lager- und Stammdatenverwaltung mit .NET 8 und WinForms — aufgeteilt in Model-, Datenzugriffs-, Logik- und Präsentationsschicht mit Dependency Injection.
Problem
Typische Verwaltungsabläufe einer Lageranwendung sollten in einer Windows-Desktopoberfläche abgebildet werden: Anmeldung, Stammdatenpflege für Produkte und Benutzer, Bestandsänderungen und ein nachvollziehbares Protokoll. Die eigentliche Aufgabe war dabei weniger die Oberfläche als die Frage, wie man eine WinForms-Anwendung strukturiert, damit sie nicht in Formular-Code erstickt.
Lösung
Die Anwendung ist in fünf Projekte getrennt: ein Modellprojekt mit Entitäten, Interfaces und Extensions, eine Datenzugriffsschicht mit Repositories auf PostgreSQL, eine Logikschicht mit Services für Anmeldung, Benutzer, Produkte, Abteilungen, Validierung und Protokollierung, eine Präsentationsschicht mit eigenen Basis-Controls und Formularen sowie ein Startprojekt, das alles über einen DI-Container zusammensetzt. Die Formulare kennen dadurch nur Interfaces — der konkrete Datenzugriff ist austauschbar. Wiederkehrende Oberflächenteile laufen über abstrakte Basisklassen für Übersichten und Bearbeitungs-Controls, sodass eine neue Entität keine neue Sonderlösung braucht.
Mein Beitrag
- Entwurf und Umsetzung der Schichtentrennung von Modell, Datenzugriff, Logik und Oberfläche.
- Aufbau des DI-Containers als Composition Root, gegen Interfaces registriert.
- Implementierung des Repository-Patterns mit generischer Basisklasse und Repositories für Benutzer, Produkte, Abteilungen und Protokolleinträge.
- Sichere Passwortspeicherung über PBKDF2 mit SHA-512, zufälligem Salt und zeitkonstantem Vergleich.
- Generischer Validierungsdienst, der Entitäten anhand definierter Formate prüft.
- Eigene wiederverwendbare WinForms-Controls und Basisklassen für Übersichts- und Bearbeitungsmasken.
- Protokollierung von Aktionen mit Level und Typ inklusive eigener Protokollansicht.
- Git-Arbeit auf einer eigenen Feature-Branch.
Aufbau
- MDL — Entitäten, Interfaces, Enums, Extensions und Validierungsformate
- DAL — Repositories auf PostgreSQL über eine generische Basisklasse
- BLL — Services für Anmeldung, Benutzer, Produkte, Abteilungen, Validierung und Protokollierung
- PL — WinForms-Oberfläche mit eigenen Controls und abstrakten Basisformularen
- Startup — Composition Root: DI-Registrierung aller Schichten, Start über das Anmeldeformular
Technische Herausforderungen
- Zustände zwischen mehreren Desktopansichten konsistent halten, ohne dass Formulare sich gegenseitig direkt kennen.
- Eine Vererbungshierarchie für Bearbeitungs-Controls finden, die Wiederverwendung erlaubt und trotzdem im WinForms-Designer benutzbar bleibt.
- Eingabevalidierung und Fehleranzeige einheitlich lösen statt pro Formular neu.
- Passwort-Handling korrekt umsetzen: Salt pro Benutzer, ausreichende Iterationszahl und ein Vergleich ohne Timing-Seitenkanal.
- Datenzugriff so kapseln, dass die Logikschicht nichts über die konkrete Datenbank weiß.
Ergebnis
Anmeldung mit Rollen, Produkt- und Benutzerverwaltung, Bestandsänderungen, persönliche Einstellungen und eine Protokollansicht sind umgesetzt. Für mich ist das Projekt vor allem der Nachweis, dass ich eine Anwendung schichtet aufbauen kann — die gleiche Trennung trägt auch in Webprojekten.
Medien