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:
- Veraltete Plattform (.NET 6.0 EOL) — unmittelbares Sicherheits- und Kompatibilitaetsrisiko
- Fehlende CI/CD — keine automatische Qualitaetssicherung
- Fehlende SAST — keine automatische Sicherheitsanalyse
- Console-Aufrufe in BL — verletzt Schichtentrennung und erschwert Testbarkeit
- 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.
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
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
1.2 NuGet-Pakete aktualisieren
Prioritaet 2 — Hoch (CI/CD & Qualitaetssicherung)
2.1 GitHub Actions CI/CD einrichten
2.2 TreatWarningsAsErrors aktivieren
2.3 CodeQL SAST einrichten
2.4 Dependabot konfigurieren
2.5 Test-Coverage mit coverlet einrichten
Prioritaet 3 — Mittel (Architektur & Wartbarkeit)
3.1 Console.WriteLine aus BL entfernen
3.2 CLI-Argument-Parsing in BL-Schicht verschieben
3.3 Result-Pattern einfuehren
3.4 Integration-Tests-Projekt anlegen
3.5 CLAUDE.md erstellen
Prioritaet 4 — Niedrig (Codequalitaet & Konventionen)
4.1 File-scoped Namespaces verwenden
4.2 .gitignore erweitern
4.3 Records statt Klassen fuer Datentypen
4.4 PublishSingleFile/SelfContained konfigurieren
4.5 Auskommentierter Code entfernen
4.6 Anforderungen-Ordner anlegen
Bewertung
Das Projekt hat eine funktionale Grundstruktur mit sauberer Trennung in Console/BL/Tests und guten Interface-Definitionen. Die Hauptprobleme sind:
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.