Skip to content

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

@stho32

Description

@stho32

Repository-Wartung WindowsServicify -- 2026-04-06

Ueberblick

Wartungsanalyse gegen die Architektur-Vorlage dotnet-windows-service. Build: 0 Warnungen, 0 Fehler. Tests: 218 bestanden (192 Unit, 26 Integration). Coverage: 88.7% Line / 86.1% Branch (Unit), 77.1% Line / 56.9% Branch (Integration).


1. Architektur-Compliance: Soll vs. Ist

Aspekt Soll (dotnet-windows-service) Ist (WindowsServicify) Status
Solution-Struktur ConsoleApp + Domain + Domain.Tests + Domain.IntegrationTests ConsoleApp + Domain + Domain.Tests + Domain.IntegrationTests Erfuellt
Dual-Mode Entry Point Environment.UserInteractive Pruefung, CLI vs. Service-Host Vorhanden in Program.cs, vollstaendig implementiert Erfuellt
BackgroundService WindowsBackgroundService : BackgroundService mit Monitoring-Loop Vorhanden, 5s Polling, Restart bei Crash, IProcessExitHandler Erfuellt
Service Installation Factory Pattern mit PowerShell + sc.exe, IWindowsServiceInstallHelper Vorhanden, beide Strategien implementiert Erfuellt
Health Check Optional, HttpListener-basiert, GET /health, 200/503 Vorhanden, konfigurierbar via HealthCheckPort Erfuellt
Logging ProcessLogger mit Rotation (7 Tage), thread-safe, IDisposable Vorhanden, alle Merkmale implementiert Erfuellt
Result Pattern Result T fuer alle fehlerbehafteten Operationen Vorhanden, konsequent eingesetzt (R00027 abgeschlossen) Erfuellt
Configuration Model Record mit HealthCheckPort, camelCase JSON, Validation Vorhanden, inkl. ServiceConfigurationValidator Erfuellt
Input Validation GeneratedRegex, Injection-Pruefung, Path-Traversal Vorhanden, inkl. Arguments + WorkingDirectory (R00024) Erfuellt
Graceful Shutdown CloseMainWindow -> WaitForExit(timeout) -> Kill(true) Vorhanden, konfigurierbarer Timeout (R00018) Erfuellt
IProcessExitHandler Abstraktion fuer Environment.Exit, testbar Vorhanden, DefaultProcessExitHandler + TestProcessExitHandler Erfuellt
Exit Codes Main gibt int zurueck, 0=Erfolg, 1=Fehler Vorhanden (R00028 abgeschlossen) Erfuellt
Target Framework .NET 10.0 net10.0 in allen Projekten Erfuellt
Nullable Reference Types enable in allen Projekten enable in allen Projekten Erfuellt
ImplicitUsings enable in allen Projekten enable in allen Projekten Erfuellt
Records fuer DTOs ServiceConfiguration, ConsoleCommandLineParameters, CommandDefinition Alle drei als record implementiert Erfuellt
InternalsVisibleTo Domain -> Tests + IntegrationTests Vorhanden in Domain.csproj Erfuellt
TreatWarningsAsErrors In allen Projekten Directory.Build.props mit TreatWarningsAsErrors=true Erfuellt
NUnit 4.x + coverlet NUnit 4.5.x, NUnit3TestAdapter 6.2.x, coverlet 8.0.x NUnit 4.5.1, NUnit3TestAdapter 6.2.0, coverlet 8.0.1 Erfuellt
CI: Build + Test + Coverage Push -> Build + Test + Coverage-Artefakt Vorhanden in build.yml Erfuellt
CI: Semver + Release workflow_dispatch mit patch/minor/major, Tag, GitHub Release Vorhanden mit prepare + build-and-release Jobs Erfuellt
CI: NuGet-Caching actions/cache fuer ~/.nuget/packages Vorhanden Erfuellt
Dependabot nuget + github-actions, woechentlich Vorhanden in dependabot.yml Erfuellt
app.manifest (UAC) requireAdministrator oder asInvoker Nicht vorhanden Fehlend
CodeQL SAST codeql.yml Workflow, security-extended Queries Nicht vorhanden Fehlend
File-scoped Namespaces namespace X; ueberall ServiceConfigurationRequester nutzt Block-Form Abweichung

Compliance-Rate: 25/28 Aspekte erfuellt (89%)


2. Aenderungen seit letzter Wartung (R00022, 06.04.2026 morgens)

Die vorherige Wartungsanalyse identifizierte 14 Vorschlaege. Seitdem wurden 12 davon als Anforderungen umgesetzt:

Vorschlag Anforderung Status
CLAUDE.md aktualisieren (direkt umgesetzt) Erledigt
TreatWarningsAsErrors R00023 Abgeschlossen
Arguments/WorkingDirectory-Validierung R00024 Abgeschlossen
CI-Release-Workflow R00025 Abgeschlossen
Integration-Tests R00026 Abgeschlossen
Result-Pattern konsequent R00027 Abgeschlossen
Exit-Codes R00028 Abgeschlossen
NuGet-Caching CI R00029 Abgeschlossen
Coverage-Report CI R00030 Abgeschlossen
Health-Check Endpoint R00031 Erledigt
Documentation bereinigen R00032 Abgeschlossen
README modernisieren R00033 Abgeschlossen
PR/Issue-Templates -- Offen
R00009-R00019 Status aktualisieren -- Offen

Erheblicher Fortschritt: 12 von 14 Vorschlaegen umgesetzt. Testanzahl von 130 auf 218 gestiegen. Coverage von 71.7% auf 88.7% (Line).


3. Aktuelle Staerken

  • Vollstaendige Architektur-Compliance bis auf 3 kleinere Luecken (89%)
  • 218 Tests (192 Unit + 26 Integration), alle gruen
  • 88.7% Line Coverage auf Domain-Code (Unit-Tests allein)
  • 0 Warnungen bei TreatWarningsAsErrors
  • Health-Check-Endpoint als Differenzierungsmerkmal implementiert
  • Moderner CI/CD-Workflow mit Semver, Release, Coverage-Artefakte
  • Defense-in-Depth-Sicherheit: Validator, Sanitierung, kein Shell-Execute

4. Verbesserungsvorschlaege

Prioritaet Hoch

4.1 CodeQL SAST-Workflow einrichten

Kategorie: Sicherheit / CI/CD
Aufwand: Klein

Die Architektur-Vorlage fordert einen CodeQL-Workflow fuer automatisierte Sicherheitsanalyse. Dieser fehlt komplett.

Umsetzung: .github/workflows/codeql.yml erstellen mit:

  • Trigger: push/PR auf main + woechentlicher Cron
  • Languages: csharp
  • Queries: security-extended

4.2 app.manifest fuer UAC-Elevation erstellen

Kategorie: Architektur-Compliance
Aufwand: Klein

Die Vorlage fordert ein app.manifest mit requireAdministrator (oder bewusst asInvoker). --install und --uninstall erfordern Admin-Rechte, aber es gibt keinen Manifest-Eintrag, der UAC-Elevation anfordert. Ohne Manifest scheitern diese Befehle still, wenn nicht als Admin ausgefuehrt.

Umsetzung:

  1. WindowsServicify.ConsoleApp/app.manifest erstellen mit requireAdministrator
  2. ApplicationManifest-Property in ConsoleApp.csproj ergaenzen

4.3 Anforderungsstatus R00009-R00019 aktualisieren

Kategorie: Dokumentation
Aufwand: Klein

Die Anforderungen R00009 bis R00019 zeigen status: Offen, obwohl sie laengst implementiert sind. Auch R00001 (erste Wartung) und R00022 (diese Wartung) sollten als abgeschlossen markiert werden.

Prioritaet Mittel

4.4 ServiceConfigurationRequester: Block-Form Namespace korrigieren

Kategorie: Code-Konsistenz
Aufwand: Klein

ServiceConfigurationRequester.cs nutzt als einzige Datei noch die Block-Form des Namespace statt der projektweit verwendeten file-scoped Form.

4.5 Roslyn Analyzer / StyleCop integrieren

Kategorie: Entwickler-Erfahrung
Aufwand: Mittel

Kein statischer Analyse-Tooling jenseits des Compilers konfiguriert. Ein Roslyn Analyzer (z.B. Microsoft.CodeAnalysis.NetAnalyzers oder StyleCop.Analyzers) wuerde Code-Style-Konsistenz automatisiert durchsetzen.

Umsetzung: Package-Reference in Directory.Build.props ergaenzen.

4.6 Combined Coverage messen

Kategorie: Test-Qualitaet
Aufwand: Klein

Unit-Tests und Integration-Tests messen Coverage separat. Die tatsaechliche Gesamtcoverage (Vereinigung beider Laeufe) wird nicht berechnet. Tools wie reportgenerator koennen mehrere Coverage-Files mergen.

Umsetzung: Im CI-Workflow nach den Tests reportgenerator ausfuehren, um einen kombinierten Coverage-Report zu erzeugen.

Prioritaet Niedrig

4.7 PR- und Issue-Templates erstellen

Kategorie: Entwickler-Erfahrung
Aufwand: Klein

Keine Templates fuer Pull Requests oder Issues vorhanden. Templates verbessern die Konsistenz externer Beitraege.

4.8 Uptime-Format im Health-Check erweitern

Kategorie: Feature
Aufwand: Klein

HealthCheckService.FormatUptime() nutzt hh:mm:ss, was bei Laufzeiten ueber 24 Stunden nicht korrekt anzeigt (nur Stunden 0-23). Fuer einen Windows-Service, der wochen- oder monatelang laeuft, sollte das Format Tage enthalten (z.B. 3d 05:30:20).

4.9 Linting-Konsistenz pruefen

Kategorie: Code-Qualitaet
Aufwand: Klein

Einige Dateien haben inkonsistente Einrueckung (Tabs vs. Spaces in .csproj-Dateien, z.B. ConsoleApp.csproj mischt Tab- und Space-Einrueckung in ItemGroup). Die .editorconfig deckt dies ab, aber bestehende Dateien wurden nicht reformatiert.


5. Uebersichtstabelle

Nr Vorschlag Kategorie Prioritaet Aufwand
4.1 CodeQL SAST-Workflow Sicherheit/CI Hoch Klein
4.2 app.manifest (UAC) Architektur Hoch Klein
4.3 Anforderungsstatus R00009-R00019 Dokumentation Hoch Klein
4.4 File-scoped Namespace korrigieren Code-Konsistenz Mittel Klein
4.5 Roslyn Analyzer integrieren Entwickler-Erfahrung Mittel Mittel
4.6 Combined Coverage messen Test-Qualitaet Mittel Klein
4.7 PR/Issue-Templates Entwickler-Erfahrung Niedrig Klein
4.8 Uptime-Format erweitern Feature Niedrig Klein
4.9 Linting-Konsistenz Code-Qualitaet Niedrig Klein

6. Gesamtbewertung

Technischer Zustand: A- (sehr gut)

Das Projekt hat seit der letzten Wartung (R00022 morgens) einen enormen Sprung gemacht. 12 Anforderungen wurden umgesetzt, die Architektur-Compliance liegt bei 89%, und die wichtigste strategische Empfehlung (Health-Check als Differenzierungsmerkmal) wurde implementiert.

Die verbleibenden 3 Architektur-Abweichungen (CodeQL, app.manifest, file-scoped Namespace) sind alle mit geringem Aufwand behebbar. Die groessten Verbesserungspotenziale liegen jetzt im Bereich Sicherheits-Tooling (CodeQL) und Developer Experience (Roslyn Analyzer).

Empfehlung: Quick Wins 4.1-4.3 sofort umsetzen (zusammen ca. 30 Minuten), dann 4.4-4.6 als naechste Iteration.

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