Partie 2 sur 3 de la série Mes Recettes : Partie 1 – Aperçu · Partie 3 – Tests & Livraison | English
Vue en couches
Les premières itérations restent légères, mais la conception s’oriente vers une architecture « clean » pragmatique :
Composition des composants
App.razor
→ MainLayout
→ pages (Recipes.razor
, Books.razor
, Authors.razor
) + composants de dialogue pour le CRUD.
Avantages :
- Style de layout partagé
- Création/édition via dialogues (rapidité perçue)
- Espace pour injecter plus tard des préoccupations transverses (chargement, notifications)
Stratégie de modélisation des données
Mappage direct table ↔ modèle via attributs :
Concept | Table | Relation |
---|---|---|
Auteur | authors |
M:N avec Books |
Livre | books |
1:N Recettes, M:N Auteurs |
Recette | recettes |
FK Livre optionnelle |
BookAuthor | books_authors |
Table de jonction |
Diagramme simplifié :
Approche de validation
- DataAnnotations assurent cohérence UI + serveur.
- Tests unitaires valident les bornes (ex. note).
- Plus tard : couche FluentValidation si règles contextuelles.
Patterns documentés (durcissement futur)
Pattern | Pourquoi | Quand l’activer |
---|---|---|
Repository | Changer de stockage, mocking aisé | Quand la logique grossit |
Unit of Work | Grouper transactions | Si modifications multi-entités |
Décorateur de cache | Réduire lectures répétées | Après identification des hotspots |
Specification | Requêtes complexes | Quand conditions combinées répétées |
Exemple : Repository (différé)
public class SupabaseRepository<T> : IRepository<T> where T : BaseModel, new()
{
private readonly SupabaseClient _client;
public async Task<List<T>> GetAllAsync() =>
(await _client.From<T>().Get()).Models ?? new();
}
Non activé pour éviter l’abstraction prématurée.
Temps réel & réhydratation
Supabase Realtime est pré‑activé (AutoConnectRealtime = true
). Une fois abonné :
- Écoute
INSERT/UPDATE/DELETE
- Mise à jour UI optimiste
- Réconciliation optionnelle après refetch silencieux
Points d’extensibilité
Extension | Point d’ancrage |
---|---|
Mode hors ligne | Service worker / cache stockage local |
Recherche | Full‑text PostgreSQL + index |
Thème | Service de palette MudBlazor |
Journal d’audit | Triggers BD → table append-only |
Analytics | Bus d’événements minimal |
Compromis
Décision | Avantage | Inconvénient |
---|---|---|
Modèle direct ↔ table | Simplicité, vitesse | Couplage schéma |
Service layer minimale | Itération rapide | Injection transverses plus difficile |
Supabase BaaS | Auth + Realtime + DB packagés | Surface fixée par le fournisseur |
100% WASM | Déploiement CDN, faible coût | Bundle initial plus lourd, pas de prerender |
Stratégie de migration (si besoin)
- Ajouter un serveur (ASP.NET) pour prerender + endpoints protégés.
- Extraire des services métier dédiés.
- Ajouter un broker messages si collaboration s’intensifie.
- Passer progressivement du client direct aux services médiateurs.
Checklist futur
- RLS (propriété par utilisateur)
- Repository/cache seulement si métriques favorables
- Flags de fonctionnalités simples
- Suivi dérive schéma BD (diff CI)
- Budget taille bundle (< 2 Mo compressé)
Source : https://github.com/mongeon/RecettesIndex