Projekt: TransferX.Domain

Rolle in der Architektur:
Domain Layer ist der fachliche Kern – keine Abhängigkeiten nach aussen. Alle anderen Schichten dürfen Domain referenzieren.

Projektstruktur

  TransferX.Domain
  |   TransferX.Domain.csproj
  |   
  +---Entities
  |   +---Providers
  |   |       ProviderConfiguration.cs
  |   |   
  |   \---Transfers
  |           Transfer.cs
  |           TransferConfiguration.cs
  |           TransferItem.cs
  |   
  +---Enumerations
  |       FileTransferStatus.cs
  |       ProgressLevel.cs
  |       ProviderOperation.cs
  |       SyncChangeType.cs
  |       TransferOperation.cs
  |       TransferStatus.cs
  |   
  +---Events
  |   |   IDomainEvent.cs
  |   |   
  |   +---Providers
  |   |       ProviderConfigurationChangedEvent.cs
  |   |       ProviderRegisteredEvent.cs
  |   |   
  |   \---Transfers
  |           FileTransferredEvent.cs
  |           TransferCompletedEvent.cs
  |           TransferFailedEvent.cs
  |           TransferStartedEvent.cs
  |   
  +---Exceptions
  |       DomainException.cs
  |       ProviderException.cs
  |       ProviderNotFoundException.cs
  |       TransferException.cs
  |       TransferNotFoundException.cs
  |   
  \---ValueObjects
      |   Credentials.cs
      |   FileMetadata.cs
      |   TransferPath.cs
      |   
      \---Progress
              FileProgress.cs
              ProgressReport.cs
              TransferProgress.cs

Komponenten

Entities (Aggregate Roots)

Klasse Typ Beschreibung
Transfer Aggregate Root Dateiübertragungsauftrag mit Status-Lifecycle (Pending → Running → Completed/Failed/Cancelled)
TransferItem Entity Einzelne Datei im Transfer mit FileTransferStatus
TransferConfiguration Aggregate Root Gespeicherte Transfer-Konfiguration (Name, Quelle, Ziel, Operation, CreatedAt) – wiederverwendbar
ProviderConfiguration Aggregate Root Provider-Konfiguration (Name, Typ, Credentials, BasePath)

Transfer – Aggregate Root Details

Property Typ Beschreibung
Id Guid Eindeutige ID des Transfers
SourceProviderId Guid ID des Quell-Providers
SourcePath TransferPath Quellpfad des Transfers
TargetProviderId Guid ID des Ziel-Providers
TargetPath TransferPath Zielpfad des Transfers
Operation TransferOperation Art der Transfer-Operation
Status TransferStatus Aktueller Ausführungsstatus
CreatedAt DateTime Zeitpunkt der Erstellung (UTC)
StartedAt DateTime? Zeitpunkt des Starts (UTC). null wenn noch nicht gestartet
CompletedAt DateTime? Zeitpunkt des Abschlusses (UTC). null wenn noch nicht abgeschlossen
FailureReason string? Fehlermeldung bei Status Failed. null sonst
OwnerProcessId int? PID des Prozesses, der den Transfer gestartet hat. Für Stale-Transfer-Erkennung bei parallelen Prozessen. null bei älteren Transfers (Legacy)
Methode Beschreibung
Create(...) Factory-Methode – erstellt neuen Transfer im Status Pending
Restore(...) Restore-Methode für Deserialisierung – stellt alle Properties inkl. ownerProcessId wieder her
Start() Setzt Status auf Running, erfasst StartedAt und speichert Environment.ProcessId als OwnerProcessId
Cancel() Setzt Status auf Cancelled, erfasst CompletedAt
Complete() Setzt Status auf Completed, erfasst CompletedAt
Fail(...) Setzt Status auf Failed, erfasst CompletedAt und optionalen FailureReason
AddItem(...) Fügt ein TransferItem zur internen Liste hinzu

Value Objects

Klasse Beschreibung
TransferPath Normalisierter Pfad (/-Trenner), immutabel, implizite String-Konvertierung
Credentials Username + Passwort (maskiert in ToString)
FileMetadata Name, Grösse, LastModified – mit Validierung
TransferProgress Gesamtfortschritt: Bytes, Dateien, Geschwindigkeit, ETA, ProgressPercent
FileProgress Dateifortschritt: Bytes, Status, ProgressPercent
ProgressReport Aggregierter Bericht nach ProgressLevel (Transfer / File / Byte)

Enumerationen

Enum Werte
TransferStatus Pending, Running, Completed, Cancelled, Failed
FileTransferStatus Pending, Transferring, Completed, Failed, Skipped
TransferOperation Copy, SyncPreview, Sync
ProviderOperation Connect, GetFolderStructure, GetFiles, GetFileContent, CreateFolder, CreateFile
SyncChangeType Added=1, Modified=2, Deleted=3
ProgressLevel Byte, File, Transfer

Exceptions

graph TD
    EX["Exception (.NET)"]
    DE["DomainException\n(abstrakt)"]
    TE["TransferException"]
    PE["ProviderException"]
    TNF["TransferNotFoundException"]
    PNF["ProviderNotFoundException"]

    EX --> DE
    EX --> TE
    EX --> PE
    DE --> TNF
    DE --> PNF

Domain Events

Event Auslöser
TransferStartedEvent Transfer wurde gestartet
TransferCompletedEvent Transfer erfolgreich abgeschlossen (Dateien + Bytes)
TransferFailedEvent Transfer fehlgeschlagen (Reason)
FileTransferredEvent Einzelne Datei übertragen
ProviderRegisteredEvent Neuer Provider registriert
ProviderConfigurationChangedEvent Provider-Konfiguration geändert

Transfer Status Lifecycle

    stateDiagram-v2 
        [*] --> Pending : Create() 
        Pending --> Running : Start() 
        Running --> Completed : Complete() 
        Running --> Failed : Fail() 
        Running --> Cancelled : Cancel() 
        Pending --> Cancelled : Cancel() 


Qualitätsmerkmale

Aspekt Umsetzung
Keine externen Abhängigkeiten Nur .NET BCL
Immutabilität Value Objects als sealed record
Validierung ArgumentException, ArgumentOutOfRangeException in Konstruktoren
Kapselung private set bei Entities, Factory-Methoden (Create(), Restore())
C# 12 / .NET 8 Primary Constructors, file-scoped namespaces
XML-Dokumentation Alle public Members dokumentiert (Deutsch)