Kernfunktionen umgesetzt Nicht öffentlich C#/.NET-Desktopprojekt im Ausbildungskontext

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

  1. MDL — Entitäten, Interfaces, Enums, Extensions und Validierungsformate
  2. DAL — Repositories auf PostgreSQL über eine generische Basisklasse
  3. BLL — Services für Anmeldung, Benutzer, Produkte, Abteilungen, Validierung und Protokollierung
  4. PL — WinForms-Oberfläche mit eigenen Controls und abstrakten Basisformularen
  5. 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

Visual-Studio-Solution-Explorer mit den fünf WarehouseWizard-Projekten MDL, DAL, BLL, PL und Startup
Die Lösung ist in fünf Projekte getrennt: Modell, Datenzugriff, Logik, Präsentation und Startup.
Solution Explorer der Modellschicht mit Entities, Enums, EventArguments, Extensions und Interfaces
Modellschicht (MDL): Entitäten, Enums, Event-Argumente und Interfaces für Datenzugriff, Logging und Validierung.
Solution Explorer der Datenzugriffsschicht mit PostgreSQL-Repositories
Datenzugriffsschicht (DAL): Repository-Pattern über eine generische Basisklasse, umgesetzt für PostgreSQL.
Solution Explorer der Logikschicht mit Services für Validierung, Abteilungen, Login, Produkte, Benutzer und Protokollierung
Logikschicht (BLL): eigenständige Services für Anmeldung, Benutzer, Produkte, Abteilungen, Validierung und Protokollierung.
Solution Explorer der Präsentationsschicht mit Controls, UControls und Forms
Präsentationsschicht (PL): wiederverwendbare Controls und Basisklassen für Übersichts- und Bearbeitungsmasken.