AccueilActualités informatique.NET 7 : La deuxième version préliminaire étend l'interface de programmation d'applications...

.NET 7 : La deuxième version préliminaire étend l’interface de programmation d’applications (CLI) .NET

Microsoft a publié la deuxième version de prévisualisation de .NET 7. On y trouve des nouveautés pour l’interface de ligne de commande, un nouveau générateur de code source ainsi que des adaptations mineures pour Entity Framework Core 7.0. Le compilateur Ahead-of-Time, attendu depuis longtemps, prend une forme plus concrète et devrait être inclus dans .NET 7.

Sommaire

Microsoft a ajouté la commande dotnet new de l’interface de ligne de commande .NET (.NET CLI), qui permet de créer de nouveaux projets .NET, a été révisée sur deux points. D’une part, la commande propose désormais une complétion par tabulation pour les noms de modèles dans les shells courants comme Bash, zsh, fish et PowerShell. Ainsi, cela suffit, dotnet new c pour ensuite, après avoir appuyé sur la touche de tabulation, obtenir des propositions telles que dotnet new classlib et dotnet new console pour obtenir des informations. De même, il y a des propositions d’options de modèles comme --framework, --language et --auth ainsi que leurs valeurs. Ces propositions de commandes doivent être activées dans une commande spécifique du shell concerné.

Deuxièmement, la commande en ligne de commande dotnet new est désormais plus cohérente avec les autres commandes CLI .NET. Les développeurs peuvent désormais appeler des sous-commandes sans syntaxe de paramètre, par exemple dotnet new list au lieu de dotnet new --list. L’ancienne syntaxe continue toutefois de fonctionner.

Depuis .NET 5.0 et C# 9, il existe déjà des générateurs de code source qui génèrent et traduisent du code source supplémentaire dans le cadre du processus de compilation. Dans .NET 7.0, Microsoft fournit désormais dans la classe System.Text.RegularExpressions.RegexGenerator un tel générateur d’expressions régulières. Pour cela, il faut écrire une classe partielle avec une méthode partielle. La méthode est définie par System.Text.RegularExpressions.RegexGeneratorAttribute en indiquant l’expression régulière et, le cas échéant, les options nécessaires pour l’analyseur RegEx. Le listing montre l’application du générateur de code source pour deux expressions régulières.

public partial class Checker  
{
 [RegexGenerator(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$", RegexOptions.IgnoreCase)]
 public static partial Regex EMailRegEx(); 
 
 [RegexGenerator(@"(?im)^[{(]?[0-9A-F]{8}[-]?(?:[0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?$", RegexOptions.IgnoreCase)]
 public static partial Regex GUIDRegEx();
 
 
 public bool IsEMail(string input)
 {
  bool isMatch = EMailRegEx().IsMatch(input);  
  return isMatch;                                      
 }
 
 public bool IsGuid(string input)
 {
  bool isMatch = GUIDRegEx().IsMatch(input);
  return isMatch;
 }
}

Le compilateur C# se charge maintenant de remplir ces méthodes partielles avec une implémentation qui fonctionne nettement plus rapidement que la compilation à l’exécution des expressions régulières utilisée jusqu’à présent. Le code source généré par le générateur peut être consulté dans le projet Visual Studio sous /Dependencies/Analyzers/. System.Text.RegularExpressions.RegexGenerator/RegexGenerator.g.cs.

Le générateur de règles est inclus dans .NET 7 depuis la Preview 1, mais Microsoft avait oublié de le mentionner.

Dans le framework web ASP.NET Core, l’injection de dépendances est désormais possible pour les paramètres des méthodes, aussi bien dans les classes de contrôleur que dans les classes de hub SignalR. Le listing ci-dessous montre les nouvelles possibilités d’injection de dépendances dans ASP.NET Core 7.0.

Services.AddScoped<SomeCustomType>();
…
[Route("[controller]")]
[ApiController]
public class MyController : ControllerBase
{
    public ActionResult GetWithAttribute([FromServices]SomeCustomType service) => Ok();
    public ActionResult Get(SomeCustomType service) => Ok();
}
…
public class MyHub : Hub
{
    public Task Method(string text, SomeCustomType type) { … }
}

Dans les API minimales introduites dans .NET 6, les textes de description pour la spécification OpenAPI peuvent être modifiés via la méthode API Fluent WithDescription() :

App
.MapGet("/pfad", () => ....)
.WithDescription("OAS-Beschreibungstext zu dieser Operation");

De même, dans les API minimales, il est désormais possible de lier des paramètres à des en-têtes et des chaînes de requête apparaissant plusieurs fois :

// GET /cities?city=Essen&city=Berlin&city=Rom
app.MapGet("/cities", (string[] names) => $"City 1: {city[0]} , City 2: {city[1]}, City 3: {city[2]}")

Dans Entity Framework Core 7.0 Preview 2, Microsoft a étendu les tables temporelles introduites dans la version 6.0 aux scénarios dans lesquels une classe d’entités est répartie sur plusieurs tables de base de données (Table Splitting alias Owned Entities). Jusqu’à présent, le mappeur OR refusait cela en affichant le message d’erreur « Temporal tables are not supported for table splitting scenario ».

Le code pour les objets générés par les migrations de schémas et dérivés de la classe de base Migration Les classes héritant de la base de données éliminent désormais les avertissements gênants de l’analyseur .NET indiquant qu’il n’y a pas de commentaires XML dans le code généré. Pour cela, on trouve désormais au début du fichier #pragma warning disable CS159 et à la fin #pragma warning restore CS1591 (voir GitHub).

Microsoft travaille depuis 2016 déjà, comme alternative au compilateur Just-in-Time, sur un compilateur Ahead-of-Timer qui génère directement du code machine et permet ainsi aux applications .NET de démarrer notamment plus rapidement. Le projet a d’abord été lancé sous le nom de « CoreRT » avant d’être transformé en « NativeAOT » en 2021. Après avoir annoncé le compilateur AOT pour .NET 5.0 et .NET 6 (et l’avoir livré uniquement pour Blazor WebAssembly dans .NET 6), Microsoft a maintenant transféré le code NativeAOT dans le dépôt officiel GitHub dotnet/runtime.

.NET 7 Preview 2 ne contient cependant pas encore d’outils SDK permettant de déclencher la compilation AOT. Ils seront fournis dans les prochaines versions. Les développeurs peuvent déjà se préparer à l’AOT en vérifiant si leurs applications fonctionnent avec l’Application Trimming au niveau des membres, introduit dans .NET 5.0. Jusqu’à présent, le trimming ne fonctionne pas avec Reflection et les applications de bureau avec WPF et Windows Forms. Cela indique également que l’AOT ne fonctionnera pas pour tous les types d’applications dans .NET 7. Selon une entrée sur GitHub, il n’y aura pas d’AOT dans .NET 7, du moins pour les applications MVC WPF et ASP.NET, car elles utilisent beaucoup Reflection.

Pour plus d’informations sur .NET 7 Preview 2, voir le blog des développeurs Microsoft. Les nouveautés dans ASP.NET Core sont présentées dans un autre billet de blog.

Plus d'articles