TransferX Architektur
Basis Dokumente: Read Me und Clean Architecture, Coding Standards and Best Practices
Übersicht
graph TD
%% ===== PRESENTATION =====
subgraph Presentation["🖥️ Presentation"]
Desktop["Desktop"]
Web["Web"]
API["API"]
Console["CLI"]
end
%% ===== APPLICATION =====
subgraph Application["📋 Application"]
PF["Provider Features"]
TF["Transfer Features"]
PI["IProvider Engine"]
TI["ITransfer Engine"]
end
%% ===== CORE =====
subgraph Core["⚙️ Core"]
PE["Provider Engine"]
TE["Transfer Engine"]
PL["Provider Loader"]
TL["Transfer Loader"]
PAgg["Progress Aggregator"]
end
%% ===== DOMAIN =====
subgraph Domain["💎 Domain"]
PD["Provider"]
TD["Transfer"]
SD["Shared"]
ProgD["Progress"]
end
%% ===== ABSTRACTIONS =====
subgraph Abstractions["📦 Abstractions"]
PAbs["Provider"]
TAbs["Transfer"]
end
%% ===== INFRA =====
subgraph Infrastructure["🔧 Infrastructure"]
PStream["Progress Stream"]
SReporter["SignalR Reporter"]
Repo["Repositories"]
end
%% ===== PLUGINS =====
subgraph Plugins["🔌 Plugins"]
Provider["Provider.*"]
Transfer["Transfer.*"]
end
%% ===== HIGH LEVEL DEPENDENCIES =====
Presentation --> Application
Application --> Core
Core --> Domain
Core --> Abstractions
Abstractions --> Domain
Plugins --> Abstractions
Infrastructure --> Application
%% ===== COLORS =====
style Presentation fill:#ffff4,stroke:#f1f12d,stroke-width:2px
style Domain fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style Application fill:#fff9c4,stroke:#fbc02d,stroke-width:2px
style Core fill:#e1f5fe,stroke:#01579b,stroke-width:2px
style Abstractions fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
style Infrastructure fill:#ffe0b2,stroke:#e65100,stroke-width:2px
style Plugins fill:#f5f5f5,stroke:#999,stroke-width:1px
Presentation Layer (UI, API, CLI)
Rolle: Kommuniziert ausschließlich über Application Features mit der Business‑Logik.
| Element | Bezeichnung | Beschreibung |
|---|---|---|
| Desktop | WPF Desktop UI | Native Windows‑Oberfläche für Interaktion, Konfiguration und Monitoring. |
| Web | ASP.NET Web UI | Browserbasierte Oberfläche für Remote‑Zugriff und Administration. |
| API | REST API | Programmierschnittstelle für externe Systeme, Automatisierung und Integrationen. |
| Console | CLI | Skript‑ und Automatisierungsoberfläche für DevOps‑ oder Batch‑Szenarien. |
Application Layer
Rolle: Definiert Use Cases und Ports (Interfaces), die vom Core implementiert und von der UI genutzt werden.
Siehe Dokumentation TransferXApplication.md
| Element | Bezeichnung | Beschreibung |
|---|---|---|
| ProviderFeatures | Provider‑Funktionen | Use‑Cases wie Konfiguration, Browsing, Credential‑Handling. |
| TransferFeatures | Transfer‑Funktionen | Use‑Cases wie Start, Stop, Fortschritt, Statusabfragen. |
| ProviderInterfaces | IProviderEngine, IProgress | Port‑Interface für Provider‑Operationen und Forschritt. |
| TransferInterfaces | ITransferEngine, IProgress | Port‑Interfaces für Transfer‑Operationen und Fortschritt. |
| ProgressReporter | IProgressReporter | Abstraktion für Fortschrittsmeldungen an UI/SignalR. |
Core Layer (Engine)
Rolle: Zentrale Geschäftslogik, orchestriert Domain‑Objekte und Plugins.
Siehe Dokumentation TransferXCore.md
| Element | Bezeichnung | Beschreibung |
|---|---|---|
| ProviderEngine | Provider Engine | Kernlogik für Provider Operationen, Konfiguration, nutzt Progress |
| TransferEngine | Transfer Engine | Kernlogik für Transfers Operation, Konfiguration, nutzt ProviderEngine und Progress |
| ProviderLoader | Provider Loader | Dynamisches Laden von Provider‑Plugins über Abstractions. |
| TransferLoader | Transfer Loader | Dynamisches Laden von Transfer‑Plugins über Abstractions. |
| ProgressAggregator | Multi‑Level Progress Aggregator | Aggregiert Fortschritt über mehrere Ebenen (Transfer → File → Byte). |
Domain Layer
Rolle: Reine Domain‑Modelle ohne Abhängigkeiten nach aussen.
Siehe Dokumentation TransferXDomain.md
| Element | Bezeichnung | Beschreibung |
|---|---|---|
| ProviderDomain | Provider Domain | Value Objects für Config, Credentials, Provider‑Metadaten. |
| TransferDomain | Transfer Domain | Value Objects für Config, Provider, Transfer, TransferItem, Status, Retry‑Infos. |
| SharedDomain | Shared Domain | ContentItem, StorageItem, generische Domain‑Objekte. |
| ProgressDomain | Progress Domain | TransferProgress, FileProgress, Byte‑Progress. |
Abstractions
Rolle: Definiert die Plugin‑Schnittstellen für Provider- und Transfer‑Engines.
Siehe Dokumentation TransferXAbstractions.md
| Element | Bezeichnung | Beschreibung |
|---|---|---|
| ProviderAbs | Provider.Abstractions | Interfaces für Provider (IProvider, IProgress Parameter). |
| TransferAbs | Transfer.Abstractions | Interfaces für Transfer‑Handler und ProgressAggregator. |
Infrastructure
Rolle: Technische Implementierungen, die Ports aus dem Application Layer bedienen.
Siehe Dokumentation TransferXInfrastructure.md
| Element | Bezeichnung | Beschreibung |
|---|---|---|
| ProgressStream | ProgressStream | Byte‑Level Tracking für Streams. |
| SignalRReporter | SignalR Reporter | Echtzeit‑Broadcast von Fortschritt an Web‑Clients. |
| Repositories | Repositories | Persistenz für Domain‑Objekte (Transfers-, Provider‑Config). |
Plugins
Rolle: Erweiterbare Module, die Abstractions implementieren.
Siehe Dokumentation TransferXImplementProviderPlugin.md
| Element | Bezeichnung | Beschreibung |
|---|---|---|
| Provider | Provider.* | Provider‑Implementierung (Commands/Queries und Progress). |
| Transfer | Transfer.* | Transfer‑Implementierung (Providers, Commands/Queries mit ProgressAggregator). |
Details: Presentation, Application
graph TD
subgraph Presentation["🖥️ Presentation Layer"]
Desktop["Desktop (WPF)"]
Web["Web (ASP.NET)"]
API["API (REST)"]
Console["Console (CLI)"]
end
subgraph Application["📋 Application Layer"]
ProviderFeatures["Provider Features"]
TransferFeatures["Transfer Features"]
ProviderInterfaces["IProviderEngine + IProgress"]
TransferInterfaces["ITransferEngine + IProgress"]
ProgressReporter["IProgressReporter"]
end
%% Dependencies
Presentation --> ProviderFeatures
Presentation --> TransferFeatures
ProviderFeatures --> ProviderInterfaces
TransferFeatures --> ProgressReporter
ProviderFeatures --> ProgressReporter
TransferFeatures --> ProviderInterfaces
TransferFeatures --> TransferInterfaces
%% ===== COLORS =====
style Presentation fill:#ffff4,stroke:#f1f12d,stroke-width:2px
%%style Domain fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style Application fill:#fff9c4,stroke:#fbc02d,stroke-width:2px
%%style Core fill:#e1f5fe,stroke:#01579b,stroke-width:2px
%%style Abstractions fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
%%style Infrastructure fill:#ffe0b2,stroke:#e65100,stroke-width:2px
%%style Plugins fill:#f5f5f5,stroke:#999,stroke-width:1px
Details: Core, Domain
graph TD
subgraph Application["📋 Application Layer"]
%% Ports (from Application)
ProviderInterfaces["IProviderEngine"]
TransferInterfaces["ITransferEngine"]
end
subgraph Core["⚙️ Core (Engine)"]
ProviderEngine["Provider Engine"]
TransferEngine["Transfer Engine"]
ProviderLoader["Provider Loader"]
TransferLoader["Transfer Loader"]
ProgressAggregator["Progress Aggregator"]
end
subgraph Domain["💎 Domain Layer"]
ProviderDomain["Provider"]
TransferDomain["Transfer"]
SharedDomain["Shared"]
ProgressDomain["Progress"]
end
%% Dependencies
ProviderInterfaces --> ProviderEngine
TransferInterfaces --> TransferEngine
ProviderEngine --> ProviderLoader
ProviderEngine --> ProviderDomain
ProviderEngine --> SharedDomain
ProviderEngine --> ProgressAggregator
ProgressAggregator --> ProgressDomain
TransferEngine --> ProgressAggregator
TransferEngine --> SharedDomain
TransferEngine --> TransferDomain
TransferEngine --> TransferLoader
%% ===== COLORS =====
%%style Presentation fill:#ffff4,stroke:#f1f12d,stroke-width:2px
style Domain fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
%%style Application fill:#fff9c4,stroke:#fbc02d,stroke-width:2px
style Core fill:#e1f5fe,stroke:#01579b,stroke-width:2px
%%style Abstractions fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
%%style Infrastructure fill:#ffe0b2,stroke:#e65100,stroke-width:2px
%%style Plugins fill:#f5f5f5,stroke:#999,stroke-width:1px
Details: Abstractions, Plugins, Infrastructure
graph TD
%% ===== PRESENTATION =====
subgraph Presentation["🖥️ Presentation"]
ProgressEvent["Progress Events"]
end
%% ===== DOMAIN =====
subgraph Domain["💎 Domain"]
end
subgraph Abstractions["📦 Abstractions"]
ProviderAbs["Provider (IProvider)"]
TransferAbs["Transfer (ITransferHandler)"]
end
subgraph Plugins["🔌 Plugins"]
Provider["Provider.*"]
Transfer["Transfer.*"]
end
subgraph Infrastructure["🔧 Infrastructure"]
ProgressStream["Progress Stream"]
SignalRReporter["SignalR Reporter"]
Repositories["Repositories"]
end
%% Dependencies
Provider --> ProviderAbs
Transfer --> TransferAbs
Transfer --> ProgressStream
Provider --> ProgressStream
SignalRReporter --> ProgressEvent
Repositories --> Domain
%% ===== COLORS =====
style Presentation fill:#ffff4,stroke:#f1f12d,stroke-width:2px
style Domain fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
%%style Application fill:#fff9c4,stroke:#fbc02d,stroke-width:2px
%%style Core fill:#e1f5fe,stroke:#01579b,stroke-width:2px
style Abstractions fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
style Infrastructure fill:#ffe0b2,stroke:#e65100,stroke-width:2px
style Plugins fill:#f5f5f5,stroke:#999,stroke-width:1px
Architecture Decision Records (ADR)
Übersicht
| Entscheidung | Kontext | Begründung |
|---|---|---|
| Abstractions | Getrennt: Provider.Abstractions & Transfer.Abstractions |
Klare Trennung, unabhängige Versionierung |
| Application Features | Getrennt: Provider Features & Transfer Features | Unterschiedliche Use Cases, Nutzer, Komplexität |
| Command Pattern | Für Provider-Operationen & Transfer-Execution | Testbarkeit, Retry-Fähigkeit, Konsistenz |
| Progress Handling | Multi-Level IProgress |
Echtzeit-Feedback, Performance-Tracking |
| Core Engines | Getrennt: ProviderEngine & TransferEngine | TransferEngine nutzt ProviderEngine |
Abstractions: Provider und Transfer
Kontext: Provider und Transfer haben unterschiedliche Verantwortlichkeiten, Lebenszyklen und Erweiterungspunkte. Beide sollen als Plugins erweiterbar sein.
Entscheidung: Wir trennen die Abstraktionen in zwei Pakete:
Provider.AbstractionsTransfer.Abstractions
Konsequenzen (positiv):
- Unabhängige Versionierung
- Klarere Verantwortlichkeiten
- Plugins können gezielt nur Provider oder nur Transfer betreffen
Konsequenzen (negativ):
- Mehr Projekte/Packages
- Höherer initialer Setup‑Aufwand
Application Features, Command Pattern, Core Engines: Für Provider und Transfer
Kontext: Provider Operationen (Browse, Config, Credentials) und Transfer Operationen (Copy, Sync, Config) haben unterschiedliche Komplexität und Use‑Cases.
Entscheidung:
ProviderEnginefür Provider‑OperationenTransferEnginefür Transfer‑Orchestrierung (nutztProviderEngine)
Konsequenzen (positiv):
- Klare Verantwortlichkeiten
- Transfer Logik kann wachsen, ohne Provider Logik zu verkomplizieren
- Bessere Testbarkeit
Konsequenzen (negativ):
- Mehr Interaktion zwischen Engines
- Mehr Schnittstellen (z. B.
IProviderEngine)
Progress Handling
Kontext: Transfers können sehr gross sein (viele Dateien, große Dateien). UI und API benötigen präzise Fortschrittsinformationen.
Entscheidung:
- Byte‑Level:
ProgressStream - File‑Level:
FileProgress - Transfer‑Level:
TransferProgress - Aggregation:
ProgressAggregator - Reporting:
IProgressReporter→ SignalR → UI
Konsequenzen (positiv):
- Sehr präzise Fortschrittsanzeige
- Gute UX in UI
- Skalierbar für große Transfers
Konsequenzen (negativ):
- Höhere Komplexität im Progress‑System
- Mehr Objekte und Events
Domain ist abhängigkeitsfrei
Kontext: Domain‑Modelle sollen langfristig stabil, testbar und unabhängig von Infrastruktur bleiben.
Entscheidung:
- Domain Layer kennt keine anderen Layer
- Alle anderen Layer dürfen Domain referenzieren
Konsequenzen (positiv):
- Hohe Testbarkeit
- Langlebige Domain‑Modelle
- Saubere Clean‑Architecture‑Trennung
Konsequenzen (negativ):
- Mapping‑Aufwand in Application/Core
- Kein direkter Zugriff auf Infrastruktur aus Domain
Abhängigkeitsregeln
| Von → Nach | Erlaubt? | Regel |
|---|---|---|
| Presentation → Application | ✅ Ja | Nur über Features |
| Application → Core | ✅ Ja | Über Interfaces (Ports) |
| Core → Domain | ✅ Ja | Direkt |
| Core → Abstractions | ✅ Ja | Für Plugin-Loading |
| Plugins → Abstractions | ✅ Ja | Implementieren Interfaces |
| Abstractions → Domain | ✅ Ja | Nutzen Value Objects |
| Infrastructure → Application | ✅ Ja | Implementieren Ports |
| Domain → ❌ Alle | ❌ Nein | Keine Abhängigkeiten nach außen |
| Transfer → Provider | ✅ Ja | Via IProviderEngine |
| Provider → Transfer | ❌ Nein | Provider kennt Transfer nicht |
Erweiterbarkeit
Neue Provider hinzufügen
Ein neuer Provider muss:
IProviderimplementierenIProgressunterstützen- in
Provider.Abstractionsregistriert werden - über
ProviderLoadergeladen werden
Beispiele: WebDAV, FTP
Siehe Dokument TransferXImplementProviderPlugin.md
Neue Transfer hinzufügen
Ein neuer Transfer muss:
ITransferHandlerimplementieren- Progress an
ProgressAggregatormelden - in
Transfer.Abstractionsregistriert werden - über
TransferLoadergeladen werden
Beispiele: Copy, SyncPreview, Sync
Implementationen
Progress System
Das Fortschrittssystem ist mehrstufig:
- Byte‑Level (ProgressStream)
- File‑Level (FileProgress)
- Transfer‑Level (TransferProgress)
- Aggregiert (ProgressAggregator)
- Reported (IProgressReporter → SignalR → UI)
Vorteile:
- Echtzeit‑Feedback
- Präzise Fortschrittsanzeige
- Skalierbar für große Transfers
- UI‑freundlich
Zeigt Byte‑Tracking, Aggregation und Reporting.
graph TD
subgraph Infrastructure["🔧 Infrastructure"]
ProgressStream["ProgressStream (Byte-Level)"]
end
subgraph Domain["💎 Domain"]
FileProgress["File Progress"]
Progress["Provider Progress, Transfer Progress"]
ProgressDomain["Progress Domain Models"]
end
subgraph Core["⚙️ Core"]
ProgressAggregator["ProgressAggregator (Multi-Level)"]
end
subgraph Application["📋 Application"]
ProgressReporter["IProgressReporter"]
end
subgraph Presentation["🖥️ UI"]
UI["UI / SignalR Client"]
end
%% Flow
ProgressStream --> FileProgress
FileProgress --> Progress
Progress --> ProgressAggregator
ProgressAggregator --> ProgressDomain
ProgressAggregator --> ProgressReporter
ProgressReporter --> UI
%% ===== COLORS =====
style Presentation fill:#ffff4,stroke:#f1f12d,stroke-width:2px
style Domain fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style Application fill:#fff9c4,stroke:#fbc02d,stroke-width:2px
style Core fill:#e1f5fe,stroke:#01579b,stroke-width:2px
%%style Abstractions fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
style Infrastructure fill:#ffe0b2,stroke:#e65100,stroke-width:2px
%%style Plugins fill:#f5f5f5,stroke:#999,stroke-width:1px
Plugin Ladeprozess
- Core lädt Abstractions
- ProviderLoader/TransferLoader scannt Assemblies
- Implementierungen werden instanziiert
- Engines nutzen die geladenen Plugins
Vorteile:
- Hot‑Swap möglich
- Keine Core‑Änderungen notwendig
- Saubere Trennung von Domain und Implementierung
Note: Transfer lädt Provider Plugins
graph TD
%% ===== APPLICATION =====
subgraph Presentation
end
subgraph Application["📋 Application Layer"]
Features["ProviderFeatures, TransferFeatures"]
Interfaces["IProviderEngine, ITransferEngine"]
end
%% ===== CORE =====
subgraph Core["⚙️ Core Engine"]
Engine["ProviderEngine, TransferEngine"]
Loader["ProviderLoader, TransferLoader"]
ProgressAggregator["ProgressAggregator"]
end
%% ===== ABSTRACTIONS =====
subgraph Abstractions["📦 Abstractions"]
IAbstractions["IProvider, ITransferHandler"]
IProgress["IProgressReporter"]
end
%% ===== PLUGINS =====
subgraph Plugins["🔌 Transfer Plugins"]
Provider["Provider*"]
Transfer["Transfer*"]
end
%% ===== INFRA =====
subgraph Infrastructure["🔧 Infrastructure"]
ProgressStream["ProgressStream\n(Byte-Level)"]
end
%% ===== DOMAIN =====
subgraph Domain["💎 Domain"]
PTDomain["ProviderDomain, TransferDomain"]
SharedDomain["SharedDomain"]
ProgressDomain["ProgressDomain"]
end
%% FLOW
Presentation --> Application
Features --> Interfaces
Interfaces --> Engine
Engine --> Loader
Loader --> IAbstractions
Provider --> IProgress
Provider --> IAbstractions
Transfer --> IAbstractions
Transfer --> IProgress
IProgress --> ProgressAggregator
ProgressAggregator --> ProgressStream
ProgressStream --> ProgressDomain
Engine --> PTDomain
Engine --> SharedDomain
Engine --> ProgressAggregator
%% ===== COLORS =====
style Presentation fill:#ffff4,stroke:#f1f12d,stroke-width:2px
style Domain fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style Application fill:#fff9c4,stroke:#fbc02d,stroke-width:2px
style Core fill:#e1f5fe,stroke:#01579b,stroke-width:2px
style Abstractions fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
style Infrastructure fill:#ffe0b2,stroke:#e65100,stroke-width:2px
style Plugins fill:#f5f5f5,stroke:#999,stroke-width:1px
Sequenz: Provider
sequenceDiagram
participant UI as UI (Desktop/Web/API)
participant AF as ProviderFeatures
participant PE as ProviderEngine
participant PL as ProviderLoader
participant Pr as IProvider
participant PR as IProgressReporter
UI->>AF: StartProvider(cmd)
AF->>PE: Execute(cmd)
PE->>PL: Load Provider Plugins
PL-->>PE: IProvider
PE ->> Pr: Execute (Inject IProgressReporter)
Pr->>PR: Report Progress
PR-->>UI: Push Updates
Pr -->> PE: Execute Completed
PE-->>AF: Result
AF-->>UI: Final Status
Sequenz: Transfer
sequenceDiagram
participant UI as UI (Desktop/Web/API)
participant AF as TransferFeatures
participant TE as TransferEngine
participant PE as ProviderEngine
participant TL as TransferLoader
participant PL as ProviderLoader
participant TH as ITransferHandler
participant PR as IProgressReporter
UI->>AF: StartTransfer(cmd)
AF->>TE: Execute(cmd)
TE->>TL: Load Transfer Plugin
TL-->>TE: ITransferHandler
TE->>PL: Load Provider Plugins
PL-->>TE: Provider Instances
TE->>PE: Prepare Providers
PE-->>TE: Provider Ready
TE->>TH: Execute (Inject IProgressReporter)
TH->>PR: Report Progress
PR-->>UI: Push Updates
TH-->>TE: Transfer Completed
TE-->>AF: Result
AF-->>UI: Final Status
- UI startet Transfer über
TransferFeatures - Application Layer ruft
ITransferEngineauf - TransferEngine lädt ProviderEngine
- ProviderEngine lädt Provider Plugins
- TransferEngine orchestriert Transfer
- IProgressReporter forward to ProgressReporter sammelt Fortschritt
- ProgressReporter sendet Updates an UI