Sébastien Rigaux

Veille technologique

← Tous les liens

.NET

Plateforme de développement Microsoft : runtime, bibliothèques, SDK et applications multiplateformes.

Logo en forme de cube composé de blocs gris, avec un bloc orange au centre.

Finbuckle.MultiTenant fournit à ASP.NET Core les briques de résolution des tenants, de configuration par tenant et d’isolation des données. Le démarrage combine une stratégie basée sur le host, un store alimenté par la configuration et le middleware UseMultiTenant().

Le middleware doit précéder ceux qui dépendent du tenant, comme l’authentification et l’autorisation. La bibliothèque propose aussi des intégrations pour les options, l’authentification et l’isolation des données avec Entity Framework Core.

Bannière « Multi-Tenant .NET, Part 4: Moving Day », avec des cartons de déménagement, un emblème de guilde et un portrait illustré.

Ce volet explique comment déplacer un tenant d’une base partagée vers une base dédiée sans arrêter l’application ni perturber les autres tenants. Le catalogue pilote le basculement, tandis que le même modèle EF Core et son filtre restent en place dans les deux modes.

La migration s’appuie sur une copie initiale, un passage temporaire en lecture seule, une copie delta et une vérification avant le cutover. Le runbook attend l’expiration du cache avant de rouvrir les écritures : les instances qui conservent encore l’ancienne connexion ne peuvent ainsi pas écrire dans la base partagée après le basculement.

BarretRepéré via C# Digest

Une main manipule des câbles réseau colorés devant des équipements installés en rack.

Avec une base par tenant, EF Core n’a plus besoin de filtre global, de colonne TenantId ni de clé de cache de modèle spécifique : le choix du tenant passe par une chaîne de connexion résolue depuis une base catalogue.

Cette isolation simplifie le modèle, mais déplace la complexité vers l’exploitation : chaque migration doit s’appliquer à toutes les bases. L’article détaille aussi le rôle de IDesignTimeDbContextFactory pour permettre à dotnet ef de créer le contexte sans requête ni tenant actif.

BarretRepéré via C# Digest

Visuel intitulé « Multi-Tenant .NET, Part 2 — Shared Database with Schema Separation » : un panneau « House for Rent », un emblème circulaire avec deux épées et un portrait illustré.

Cette partie 2/4 montre comment isoler les données de chaque tenant dans son propre schéma SQL Server, sans filtre global ni colonne TenantId obligatoire. Le modèle EF Core retrouve ainsi une clé primaire simple, tandis que la frontière d’isolation est portée par la structure de la base.

Le changement central tient au cache du modèle : OnModelCreating ne s’exécute qu’une fois par modèle. Il faut intégrer le schéma à la clé via IModelCacheKeyFactory, faute de quoi EF Core peut réutiliser celui du premier tenant. L’article détaille aussi le provisionnement et les migrations par schéma, ainsi que la validation stricte des noms de schéma interpolés dans le SQL.

BarretRepéré via C# Digest

Bannière sur fond d’immeubles résidentiels, titrée « Multi-Tenant .NET, Part 1 — Shared Database with Partitions », avec un emblème d’épées croisées et un portrait illustré.

Cette première partie présente une architecture multi-tenant .NET à schéma partagé : EF Core filtre les lectures par tenant et SQL Server partitionne physiquement les lignes pour accélérer l’accès aux données. Le point essentiel : le partitionnement n’est pas une frontière de sécurité ; l’isolation repose sur le filtre global EF Core.

L’article détaille aussi la résolution du tenant par requête, l’attribution de son identifiant aux nouvelles lignes et l’ajout des partitions aux migrations avec du SQL brut. La clé primaire doit inclure GuildId, contrainte imposée par SQL Server pour partitionner un index unique.

BarretRepéré via C# Digest

Extrait de code C# déclarant les records Windows, Linux et MacOS, puis une union SupportedOS contenant ces trois types.

C# 15 introduit le mot-clé union pour représenter une valeur parmi plusieurs types sans les regrouper dans une classe de base ni perdre leur typage dans object. Andrew Lock montre comment les switch expressions vérifient que chaque cas est traité, et comment déclarer des unions comme Result<T>.

Le détail à considérer côté performance : l’implémentation générée stocke la valeur dans un object, ce qui boxe les types valeur. L’article présente une implémentation personnalisée avec TryGetValue pour éviter ce boxing dans les switch.

Andrew LockRepéré via C# Digest

Illustration jaune « Buy me a coffee » avec une tasse stylisée.

IfItQuacks permet d’utiliser en C# des objets qui correspondent à une interface sans l’implémenter ni hériter d’une classe commune. L’attribut [DuckTyped] déclenche un générateur de code qui vérifie la compatibilité à la compilation et crée un adaptateur, sans réflexion ni dynamic.

Les types anonymes peuvent aussi servir de stubs de test : un objet { Name = "Steven", Age = 90 } satisfait ainsi une interface IPerson. Les adaptateurs préservent par ailleurs l’identité en transférant Equals, GetHashCode et ToString à l’objet sous-jacent.

Steven GieselRepéré via C# Digest

Bandeau de l’article avec son titre, le nom de Ricardo Groß et la date « Jun 11 », sur fond blanc.

CodoMetis.ValueRanges propose des types d’intervalle .NET pour remplacer les paires de dates et leur logique dispersée. Les cinq variantes — finie, sans borne gauche ou droite, infinie et vide — rendent explicites les formes possibles et leurs règles, tandis que les opérations comme Contains et Overlaps s’exécutent en mémoire.

Le package EF Core associé fait le pont avec PostgreSQL : les mêmes opérations dans le domaine sont traduites en opérateurs SQL via Npgsql. L’article détaille aussi le compromis de conception : des records abstraits plutôt que des structs, pour représenter les variantes par une hiérarchie de types.

@Repéré via C# Digest

Metalama automatise les patterns transverses en C# avec des aspects qui génèrent le code à la compilation, tout en vérifiant les règles d’architecture dès l’édition. L’implémentation répétitive reste ainsi hors du code métier et du dépôt, tandis qu’un même aspect peut être appliqué à une méthode ou à un ensemble de méthodes sélectionnées par code.

Un aspect peut, par exemple, envelopper une méthode dans un try/catch pour journaliser son entrée, son résultat et ses exceptions. Metalama permet aussi de prévisualiser le code transformé et de le déboguer, pour rendre ces transformations inspectables.

Repéré via C# Digest

Présentation de dotnetup, le gestionnaire de toolchain .NET, sur le blog officiel .NET

Microsoft lance dotnetup, un gestionnaire de toolchain .NET inspiré de rustup et nvm, qui simplifie l’installation, la mise à jour et la gestion de multiples versions du SDK et des runtimes, sans droits administrateur. L’outil fonctionne dans le dossier utilisateur, respecte les fichiers global.json et permet de suivre des canaux de versions ou d’installer des builds quotidiens, tout en facilitant le nettoyage des versions obsolètes. Il vise aussi les usages CI/CD et promet une expérience unifiée sur macOS, Linux et bientôt Windows.

Chet Husk

Logo .NET 11

Cette page officielle Microsoft Learn présente un tour d’horizon complet des nouveautés de .NET 11, actuellement en version candidate. Elle détaille les évolutions du runtime (performances, Async natif, JIT, WebAssembly), des bibliothèques (API numériques, compression, System.Text.Json, sécurité, LINQ, etc.), du SDK (outils CLI, tests, conteneurs, OpenTelemetry) et du langage C# 15. Les développeurs y trouveront un résumé des principales avancées, des liens vers les nouveautés ASP.NET Core, EF Core, Windows Forms et WPF, ainsi que les dates clés de publication. Idéal pour anticiper la migration ou explorer les nouvelles possibilités de la plateforme .NET.

gewarren