Skip to content

Wartung 2026-04-06: Architektur-Compliance und Verbesserungen #3

@stho32

Description

@stho32

Wartung 2026-04-06: Architektur-Compliance und Verbesserungen

Zusammenfassung

Wartungsanalyse des Repositories gegen die Architektur-Vorlage dotnet-cli-tool. Das Projekt ist ein funktionierender Website-Crawler/Validator auf Basis von .NET 6.0 mit einer grundlegenden Schichten-Architektur (Console -> BL -> Tests). Es bestehen jedoch erhebliche Abweichungen zur Soll-Architektur.

Build-Status: Kompiliert erfolgreich (2 Warnungen: net6.0 EOL).
Test-Status: Tests koennen nicht ausgefuehrt werden (.NET 6.0 Runtime fehlt auf aktuellem System, da EOL).


Architektur-Compliance: Soll vs. Ist

Kriterium Soll (dotnet-cli-tool) Ist (website-validator) Status
.NET Version net8.0+ net6.0 (EOL seit Nov 2024)
Solution-Struktur Source/Name/Name.sln source/WebsiteValidator/WebsiteValidator.sln 🔶 (aehnlich, aber source statt Source)
Entry Point Projekt Name/Name.csproj (Console App) WebsiteValidator.Console/WebsiteValidator.Console.csproj
BL Projekt Name.BL/Name.BL.csproj (Class Library) WebsiteValidator.BL/WebsiteValidator.BL.csproj
Unit Tests Name.BL.Tests/ mit NUnit WebsiteValidator.BL.Tests/ mit xUnit 🔶 (vorhanden, aber xUnit statt NUnit)
Integration Tests Name.BL.IntegrationTests/ (separates Projekt) Nicht vorhanden
TreatWarningsAsErrors Alle Projekte Keines der Projekte
Nullable Alle Projekte enable Alle Projekte enable
PublishSingleFile/SelfContained Entry Point: true/true Nicht konfiguriert
CLI Parser CommandLineParser (NuGet) System.CommandLine (beta 2.0.0-beta1) 🔶 (funktional, aber Beta-Paket)
CommandLineArguments-Ordner BL/CommandLineArguments/ mit Options + Parser Inline in Program.cs (top-level statements)
Common/Result.cs Result-Pattern fuer Fehlerbehandlung Nicht vorhanden
Logging ILogger/ConsoleLogger/LoggerFactory in BL Nicht vorhanden, direkte Console.WriteLine-Aufrufe in BL
Command/Strategy Pattern Commands als Klassen mit ICommand Logik direkt in Crawler-Klasse
File-scoped Namespaces namespace X; Block-Form namespace X { }
Exit Code Main() gibt int zurueck (0/non-zero) return rootCommand.InvokeAsync(args).Result; (gibt int zurueck)
Interfaces Fuer alle externen Abhaengigkeiten Vorhanden fuer IDownloadAWebpage, IUrlExtractor, IOutputHelper etc.
CI/CD (GitHub Actions) Build + Test + Publish Workflow Kein .github/workflows/ Verzeichnis vorhanden
CodeQL SAST codeql.yml Workflow Nicht vorhanden
Dependabot .github/dependabot.yml Nicht vorhanden
CLAUDE.md Projektdokumentation fuer KI-Assistenz Nicht vorhanden
Anforderungen/ Ordner fuer Anforderungsdokumente Nicht vorhanden
.gitignore Umfassendes Template Nur spezifische Debug-Pfade (7 Zeilen) 🔶
Test-Coverage (coverlet) coverlet.collector in Test-Projekten Nicht vorhanden
Hand-written Mocks Mocks/ Ordner in Tests Nicht vorhanden (Tests instanzieren direkt)
Records fuer Daten Records fuer immutable Datentypen Klassen mit get-only Properties 🔶

Compliance-Quote: 5 von 24 Kriterien erfuellt (ca. 21%)


Verbesserungsvorschlaege nach Prioritaet

Prioritaet 1 — Kritisch (Sicherheit & Lauffaehigkeit)

1.1 .NET 6.0 auf .NET 8.0+ upgraden

  • .NET 6.0 ist seit November 2024 End-of-Life und erhaelt keine Sicherheitsupdates mehr
  • Tests koennen auf aktuellen Systemen nicht ausgefuehrt werden (Runtime 6.0 fehlt)
  • Alle .csproj-Dateien: TargetFramework net6.0 auf net8.0 aendern
  • Betroffene Dateien: WebsiteValidator.Console.csproj, WebsiteValidator.BL.csproj, WebsiteValidator.BL.Tests.csproj

1.2 NuGet-Pakete aktualisieren

  • System.CommandLine 2.0.0-beta1.21308.1 — Beta-Version von 2021, seit Jahren kein stable Release. Entweder auf aktuelle Beta updaten oder zu CommandLineParser 2.9.1 wechseln (wie Architektur-Vorlage)
  • HtmlAgilityPack 1.11.38 — aktuelle Version pruefen und updaten
  • Newtonsoft.Json 13.0.1 — auf 13.0.3+ updaten oder durch System.Text.Json ersetzen
  • Microsoft.NET.Test.Sdk 17.0.0 — auf 17.14.0 updaten
  • xunit 2.4.2-pre.12 — Pre-Release-Version, auf stabile Version updaten

Prioritaet 2 — Hoch (CI/CD & Qualitaetssicherung)

2.1 GitHub Actions CI/CD einrichten

  • .github/workflows/build-and-test.yml erstellen (Build, Test, Publish)
  • Ohne CI/CD gibt es keine automatische Qualitaetskontrolle bei Code-Aenderungen

2.2 TreatWarningsAsErrors aktivieren

  • TreatWarningsAsErrors true in alle .csproj-PropertyGroups einfuegen
  • Verhindert schleichenden Qualitaetsverlust

2.3 CodeQL SAST einrichten

  • .github/workflows/codeql.yml erstellen mit security-extended Suite
  • Automatische Sicherheitsanalyse fuer C#-Code

2.4 Dependabot konfigurieren

  • .github/dependabot.yml fuer automatische NuGet- und GitHub-Actions-Updates

2.5 Test-Coverage mit coverlet einrichten

  • coverlet.collector als PackageReference in WebsiteValidator.BL.Tests.csproj hinzufuegen
  • Coverage-Messung ermoeglicht Tracking der Testabdeckung

Prioritaet 3 — Mittel (Architektur & Wartbarkeit)

3.1 Console.WriteLine aus BL entfernen

  • Crawler.cs (Zeilen 51, 93, 153) verwendet direkt Console.WriteLine — verletzt die Schichtentrennung
  • Logging-Interface (ILogger) einfuehren und per Dependency Injection uebergeben
  • BL-Schicht darf keine Konsolenabhaengigkeiten haben

3.2 CLI-Argument-Parsing in BL-Schicht verschieben

  • Program.cs enthaelt CLI-Definition und Geschaeftslogik-Aufrufe direkt vermischt
  • CommandLineArguments/-Ordner in BL anlegen mit CommandLineOptions.cs und CommandLineArgumentsParser.cs

3.3 Result-Pattern einfuehren

  • Common/Result.cs in BL anlegen
  • Oeffentliche Methoden geben Result-Objekte zurueck statt Exceptions zu werfen
  • Aktuell: Crawler.CrawlEverything() gibt IUrlInformation[] zurueck, Fehler werden per catch verschluckt (Zeile 89-92)

3.4 Integration-Tests-Projekt anlegen

  • WebsiteValidator.BL.IntegrationTests/ als separates Testprojekt
  • Die bestehenden DownloadAWebpageTests sind eigentlich Integrationstests (HTTP-Aufrufe) und gehoeren dorthin

3.5 CLAUDE.md erstellen

  • Projektdokumentation fuer KI-Assistenz mit Build/Test/Run-Befehlen und Architektur-Ueberblick

Prioritaet 4 — Niedrig (Codequalitaet & Konventionen)

4.1 File-scoped Namespaces verwenden

  • Alle .cs-Dateien verwenden Block-Form namespace X { } — auf namespace X; umstellen
  • Betrifft alle ca. 20 Quelldateien

4.2 .gitignore erweitern

  • Aktuelle .gitignore deckt nur spezifische Debug-Pfade ab
  • Standard-.NET-Patterns ergaenzen: bin/, obj/, .vs/, *.user, TestResults/, etc.

4.3 Records statt Klassen fuer Datentypen

  • Webpage, UrlInformation — immutable Datentypen, ideal als Records
  • Reduziert Boilerplate und macht Unveraenderlichkeit explizit

4.4 PublishSingleFile/SelfContained konfigurieren

  • Entry-Point-Projekt: PublishSingleFile true und SelfContained true hinzufuegen
  • Ermoeglicht einfache Verteilung als einzelne .exe

4.5 Auskommentierter Code entfernen

  • Crawler.cs enthaelt mehrere auskommentierte Zeilen (57, 83-86)
  • Toter Code verschlechtert die Lesbarkeit

4.6 Anforderungen-Ordner anlegen

  • Anforderungen/ im Projekt-Root fuer strukturierte Anforderungsdokumente
  • Aktuell sind Aufgaben nur in der README.md als Checkliste

Bewertung

Das Projekt hat eine funktionale Grundstruktur mit sauberer Trennung in Console/BL/Tests und guten Interface-Definitionen. Die Hauptprobleme sind:

  1. Veraltete Plattform (.NET 6.0 EOL) — unmittelbares Sicherheits- und Kompatibilitaetsrisiko
  2. Fehlende CI/CD — keine automatische Qualitaetssicherung
  3. Fehlende SAST — keine automatische Sicherheitsanalyse
  4. Console-Aufrufe in BL — verletzt Schichtentrennung und erschwert Testbarkeit
  5. Pre-Release-Abhaengigkeiten — Beta-Pakete ohne Stabilitaetsgarantie

Empfehlung: Mit dem .NET-8.0-Upgrade (1.1) und NuGet-Updates (1.2) beginnen, dann CI/CD aufsetzen (2.1-2.4), danach schrittweise die Architektur-Compliance erhoehen.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions