API Bancaire en .NET 8 utilisant le pattern MVVM (Model-View-ViewModel) avec injection de dépendances.
BankingKata-MVVM/
├── Models/ # Modèles de domaine (Business Logic)
├── Repositories/ # Accès aux données (thread-safe via interfaces)
├── Services/ # Couche Service (logique métier)
├── Commands/ # ICommand pattern pour MVVM
├── ViewModels/ # ViewModels avec INotifyPropertyChanged
├── Controllers/ # Contrôleurs API (utilisent IAccountService)
└── Program.cs # Configuration DI
- Model : Données et logique métier (BankAccount, SavingsAccount, Transaction)
- View : Controllers API qui retournent des ViewModels en JSON
- ViewModel : État observable avec
INotifyPropertyChangedetICommand
Controller API → IAccountService → Repositories → Models
↓
ViewModels (pour UI XAML)
public class AccountsController : ControllerBase
{
private readonly IAccountService _accountService;
public AccountsController(IAccountService accountService)
{
_accountService = accountService;
}
}builder.Services.AddSingleton<IBankAccountRepository, BankAccountRepository>();
builder.Services.AddSingleton<ITransactionRepository, TransactionRepository>();
builder.Services.AddSingleton<ISavingsAccountRepository, SavingsAccountRepository>();
builder.Services.AddTransient<IAccountService, AccountService>();graph TB
subgraph "View"
C[Controllers<br/>API]
end
subgraph "Service"
AS[IAccountService]
end
subgraph "ViewModel"
AVM[AccountsViewModel<br/>ICommand]
end
subgraph "Model"
BA[BankAccount]
SA[SavingsAccount]
T[Transaction]
end
subgraph "Infrastructure"
IBR[IBankAccountRepository<br/>ConcurrentDictionary]
ISR[ISavingsAccountRepository<br/>ConcurrentDictionary]
end
C -->|inject| AS
AS --> BA
AS --> SA
AS --> T
BA --> IBR
SA --> ISR
AVM --> AS
style View fill:#f9f,stroke:#333
style Service fill:#fc3,stroke:#333
style ViewModel fill:#bbf,stroke:#333
style Model fill:#dfd,stroke:#333
style Infrastructure fill:#fdd,stroke:#333
sequenceDiagram
participant C as Controller
participant S as IAccountService
participant R as Repository
participant M as Model
C->>S: Opération métier<br/>(Deposit/Withdraw)
S->>M: Logique métier
M->>R: Sauvegarde<br/>(ConcurrentDictionary)
R-->>M: OK
M-->>S: Retourne données
S-->>C: ViewModel (JSON)
public class BankAccountRepository : IBankAccountRepository
{
private readonly ConcurrentDictionary<string, BankAccount> _accounts = new();
}public class AccountsViewModel
{
public AccountsViewModel(IAccountService accountService)
{
AddAccountCommand = new RelayCommand<CreateAccountViewModel>(AddAccount);
DepositCommand = new RelayCommand<DepositCommandParameter>(Deposit);
}
public ICommand AddAccountCommand { get; }
public ICommand DepositCommand { get; }
}
// Paramètres de commande
public class DepositCommandParameter
{
public string AccountNumber { get; set; }
public decimal Amount { get; set; }
}public class CreateAccountViewModel
{
[Required]
[StringLength(20, MinimumLength = 1)]
public string AccountNumber { get; set; }
}| Méthode | Endpoint | Description |
|---|---|---|
| GET | /api/accounts |
Liste tous les comptes |
| GET | /api/accounts/{accountNumber} |
Détails |
| POST | /api/accounts |
Créer |
| POST | /api/accounts/{accountNumber}/deposit |
Déposer |
| POST | /api/accounts/{accountNumber}/withdraw |
Retirer |
| POST | /api/accounts/{accountNumber}/overdraft |
Modifier découvert |
| GET | /api/accounts/{accountNumber}/statement |
Relevé |
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /api/savings |
Liste |
| GET | /api/savings/{accountNumber} |
Détails |
| POST | /api/savings |
Créer |
| POST | /api/savings/{accountNumber}/deposit |
Déposer |
| POST | /api/savings/{accountNumber}/withdraw |
Retirer |
cd BankingKata-MVVM
dotnet runAPI : http://localhost:5000
Swagger : http://localhost:5000/swagger
dotnet test19 tests passent (AccountsViewModelTests, SavingsViewModelTests)