Aller au contenu

Vue d'ensemble de l'architecture


Structure de la solution

Easy_Save/
├── EasyLog/                  Bibliothèque de log (DLL, versionnée séparément)
├── EasySave.Core/            Logique métier partagée entre toutes les interfaces
│   ├── Models/               SaveJob, SaveState, SaveType
│   └── Services/             SaveExecutor, ConfigService, StateService, AppPaths
│                             + CryptoService, BusinessAppWatcher (v2.0+)
├── EasySave.Console/         Application console (v1.0 / v1.1)
├── EasySave.ViewModel/       ViewModels WPF (v2.0+)
├── EasySave.WPF/             Application graphique WPF (v2.0+)
│   ├── Views/                Fenêtres et UserControls XAML
│   └── Resources/            Styles, localisation .resx
└── EasySave.Tests/           Tests unitaires (MSTest)

Séparation des responsabilités

┌───────────────────────────────┐
│         EasySave.WPF          │  Interface graphique — XAML uniquement
│         Views / Resources     │  Aucune logique métier
└──────────────┬────────────────┘
               │  data binding
┌──────────────▼────────────────┐
│      EasySave.ViewModel       │  Présentation — INotifyPropertyChanged
│      BaseViewModel, SaveJobVM │  ICommand, IProgress, events
└──────────────┬────────────────┘
               │  appels de services
┌──────────────▼────────────────┐
│       EasySave.Core           │  Métier — aucune dépendance UI
│       SaveExecutor, Services  │  Réutilisable (console, WPF, tests)
└──────────────┬────────────────┘
               │  journalisation
┌──────────────▼────────────────┐
│          EasyLog              │  DLL indépendante — JsonLogger, XmlLogger
└───────────────────────────────┘

Pattern MVVM

EasySave v2.0+ suit strictement le pattern Model–View–ViewModel :

Couche Projet Rôle
Model EasySave.Core Logique métier, entités, services
ViewModel EasySave.ViewModel État UI, commandes, liaison de données
View EasySave.WPF XAML pur, data binding, aucun code métier

Règles strictes

  • Pas de new SaveExecutor() dans une View
  • Pas de logique conditionnelle dans le code-behind .xaml.cs
  • Toute commande UI passe par RelayCommand dans un ViewModel
  • Tout texte visible passe par les fichiers .resx

Flux d'exécution d'une sauvegarde

User clicks "Execute"
        │
SaveJobViewModel.ExecuteCommand
        │
SaveExecutor.RunAsync(job, progress)
        │
BusinessAppWatcher.IsRunning() ──→ true? → throw/return false
        │
ISaveStrategy.ExecuteSaveJob(job, state, progress)
        │
  ┌─────┴──────┐
  │ Per file:  │
  │ Copy file  │
  │ CryptoSvc  │ (if extension matches)
  │ Log entry  │
  │ progress.Report(state) ──→ ViewModel.Progress ──→ ProgressBar
  └────────────┘

Conventions de nommage

Élément Convention Exemple
Classes, méthodes, propriétés PascalCase SaveExecutor, RunAsync
Variables locales, paramètres camelCase sourceFile, jobName
Classes domaine sauvegarde Préfixe Save* SaveJob, SaveState, SaveType
Views WPF Suffixe View JobListView, SettingsView
ViewModels Suffixe ViewModel SaveJobViewModel
Services Suffixe Service ou Watcher CryptoService, BusinessAppWatcher

Langues et localisation

  • Tout le code, les commentaires et les commits sont en anglais
  • Toutes les chaînes visibles par l'utilisateur passent par les fichiers .resx (FR + EN)
  • Strings.cs expose les clés comme propriétés statiques typées pour XAML
  • Aucun texte hardcodé en XAML ou dans le code-behind