3.4 KiB
| type | status | owner | last_update |
|---|---|---|---|
| Reference | ACTIVE | Lead Architect | 2026-03-15 |
Frontend-Architektur & Modularisierungsstrategie
Status: ENTWURF Zuletzt aktualisiert: 2026-01-19 Kontext: Migration zu Clean Architecture & Feature-Modulen
1. Übersicht
Die Frontend-Architektur von Meldestelle basiert auf Kotlin Multiplatform (KMP) mit Compose Multiplatform für die Benutzeroberfläche. Wir folgen einem strikten Clean Architecture-Ansatz, um Testbarkeit, Skalierbarkeit und Trennung der Zuständigkeiten sicherzustellen.
2. Modulstruktur
Das Projekt ist in folgende Schichten unterteilt:
2.1 Core-Module (frontend/core)
Wiederverwendbare Komponenten, die unabhängig von spezifischen Geschäftsfunktionen sind.
core-network: Zentrale HTTP-Client-Konfiguration (Auth, Logging, ContentNegotiation).core-sync: Generische Synchronisierungslogik (SyncManager,SyncableRepository).core-ui: Gemeinsame UI-Komponenten und Design-System.
2.2 Feature-Module (frontend/features)
Jede Geschäftsdomäne (z.B. ping, auth, events) liegt in ihrem eigenen Modul.
Ein Feature-Modul MUSS die Clean Architecture Paketstruktur einhalten:
at.mocode.{feature}.feature.domain- Entitäten: Reine Datenklassen.
- Interfaces: Repository-Interfaces, Service-Interfaces.
- Use Cases: Geschäftslogik (optional, für komplexe Logik).
at.mocode.{feature}.feature.data- Implementierungen: Repository-Implementierungen, API-Clients.
- DTOs: Data Transfer Objects (wenn von Domain-Entitäten abweichend).
at.mocode.{feature}.feature.presentation- ViewModels: Zustandsverwaltung.
- Screens: Composable-Funktionen.
at.mocode.{feature}.feature.di- Koin-Modul: Konfiguration der Dependency Injection.
2.3 Shells (frontend/shells)
Anwendungs-Einstiegspunkte, die alles zusammenführen.
meldestelle-portal: Die Haupt-Web-/Desktop-Anwendung.
3. Migrationsstrategie (Übergangsphase)
Wir migrieren aktuell von einer monolithischen clients-Paketstruktur zu modularen Feature-Modulen.
Regeln für die Migration:
- Neue Features: Müssen direkt in
frontend/features/{name}unter Verwendung der Clean Architecture-Struktur implementiert werden. - Bestehende Features: Werden schrittweise migriert.
- Koexistenz: Während des Übergangs ist Legacy-Code in
clients/erlaubt, aber als veraltet markiert. - Dependency Injection: Legacy-Code muss die neuen Koin-Module verwenden, sofern verfügbar.
- Keine Ghost-Klassen: Klassen nicht duplizieren. Wenn eine Klasse in ein Feature-Modul verschoben wird, muss die alte in
clients/gelöscht werden.
4. Wichtige Entscheidungen (ADRs)
ADR-001: Entkopplung der Sync-Logik
- Entscheidung: ViewModels dürfen nicht direkt vom
SyncManagerabhängen. - Begründung: Um einfacheres Testen zu ermöglichen und die Komplexität des generischen Sync-Mechanismus zu verbergen.
- Umsetzung: Ein Domain-Service-Interface (z.B.
PingSyncService) einführen, das denSyncManager-Aufruf kapselt.
ADR-002: Feature-Modul-Isolation
- Entscheidung: Feature-Module sollten nach Möglichkeit nicht direkt voneinander abhängen.
- Kommunikation: Gemeinsame Core-Module oder lose Kopplung über Interfaces/Events verwenden, wenn modulübergreifende Kommunikation nötig ist.
Freigegeben von: Lead Architect