Comment créer des services légers dans ASP.NET Core 6

Comment créer des services légers dans ASP.NET Core 6

Lorsque vous travaillez dans des applications Web dans ASP.NET Core, vous souhaiterez peut-être souvent créer des services légers, c'est-à-dire des services qui n'ont pas de modèle ou de classe de contrôleur, pour réduire la consommation de ressources et améliorer les performances. Vous pouvez créer ces services ou API légers dans la classe Startup ou Program.

Cet article explique comment vous pouvez créer de tels services légers dans ASP.NET Core 6. Pour travailler avec les exemples de code fournis dans cet article, Visual Studio 2022 doit être installé sur votre système. Si vous n'en avez pas déjà une copie, vous pouvez télécharger Visual Studio 2022 ici.

Créer un projet d'API Web ASP.NET Core dans Visual Studio 2022

Tout d'abord, créons un projet ASP.NET Core dans Visual Studio 2022. Suivez ces étapes pour créer un nouveau projet ASP.NET Core Web API 6 dans Visual Studio 2022 :

  1. Lancez l'IDE Visual Studio 2022.
  2. Cliquez sur "Créer un nouveau projet".
  3. Dans la fenêtre "Créer un nouveau projet", sélectionnez "API Web ASP.NET Core" dans la liste des modèles affichés.
  4. Cliquez sur Suivant.
  5. Dans la fenêtre "Configurer votre nouveau projet", indiquez le nom et l'emplacement du nouveau projet.
  6. Cochez éventuellement la case "Placer la solution et le projet dans le même répertoire", selon vos préférences.
  7. Cliquez sur Suivant.
  8. Dans la fenêtre "Informations supplémentaires" affichée ensuite, sélectionnez .NET 6.0 (Aperçu) comme framework cible dans la liste déroulante en haut. Laissez le "Type d'authentification" sur "Aucun" (par défaut).
  9. Assurez-vous que les cases à cocher "Activer Docker", "Configurer pour HTTPS" et "Activer la prise en charge de l'API ouverte" ne sont pas cochées, car nous n'utiliserons aucune de ces fonctionnalités ici.
  10. Cliquez sur Créer.

Nous utiliserons ce nouveau projet d'API Web ASP.NET Core 6 pour illustrer l'utilisation de services légers dans les sections suivantes de cet article.

Démarrez avec un service léger dans ASP.NET Core

Comme nous allons créer des services légers qui ne nécessitent pas de contrôleur, vous devez maintenant supprimer le dossier de solution Controllers et toutes les classes de modèle créées par défaut.

Ensuite, ouvrez le fichier launchSettings.json sous le dossier de solution Propriétés et supprimez ou commentez la paire clé-valeur launchUrl comme indiqué dans l'extrait de code ci-dessous.

Le launchUrl fait référence à l'hôte de votre application. Lorsque l'application est lancée, l'URL spécifiée dans launchURL est utilisée pour démarrer l'application. Si l'URL est erronée ou n'existe pas, l'application génère une erreur au démarrage. En supprimant launchUrl ou en le commentant, nous nous assurons que l'application n'utilise pas le launchUrl par défaut pour lancer l'application et ainsi nous évitons toute erreur. Une fois le launchUrl supprimé, l'application reviendra au port 5000.

"profiles": {
    "Light_Weight_Services": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      //"launchUrl": "",
      "applicationUrl": "http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      //"launchUrl": "",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }

Utiliser les méthodes d'extension IEndpointConventionBuilder dans ASP.NET Core

Nous allons maintenant tirer parti de certaines des méthodes d'extension de l'interface IEndpointConventionBuilder pour mapper les requêtes. Voici la liste de ces méthodes d'extension :

  • MapGet
  • Carte Post
  • MapDelete
  • MapPut
  • Pages MapRazor
  • MapControllers
  • MapHub
  • MapGrpcServices

Les méthodes MapGet, MapPost, MapDelete et MapPut sont utilisées pour connecter le délégué de demande au système de routage. MapRazorPages est utilisé pour RazorPages, MapControllers pour les contrôleurs, MapHub pour SignalR et MapGrpcService pour gRPC.

L'extrait de code suivant illustre comment vous pouvez utiliser MapGet pour créer un point de terminaison HTTP Get.

endpoints.MapGet("/", async context =>
{
     await context.Response.WriteAsync("Hello World!");
});

Créez maintenant un nouveau fichier C# nommé Auteur et saisissez le code suivant :

public class Author
{
   public int Id { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
}

Créez une liste d'auteurs en lecture seule et remplissez-la avec des données comme indiqué dans l'extrait de code ci-dessous.

private readonly List<Author> _authors;
        public Startup(IConfiguration configuration)
        {
            _authors = new List<Author>
            {
                new Author
                {
                    Id = 1,
                    FirstName = "Joydip",
                    LastName = "Kanjilal"
                },
                new Author
                {
                    Id = 2,
                    FirstName = "Steve",
                    LastName = "Smith"
                },
                new Author
                {
                    Id = 3,
                    FirstName = "Julie",
                    LastName = "Lerman"
                }
            };
            Configuration = configuration;
        }

Vous pouvez utiliser le code suivant pour créer un autre point de terminaison et renvoyer la liste des auteurs au format JSON.

endpoints.MapGet("/authors", async context =>
{
      var authors = _authors == null ? new List<Author>() : _authors;
      var response = JsonSerializer.Serialize(authors);
      await context.Response.WriteAsync(response);
});

Récupérer un enregistrement à l'aide de services légers dans ASP.NET Core

Pour récupérer un enregistrement particulier en fonction de l'ID, vous pouvez écrire le code suivant :

endpoints.MapGet("/authors/{id:int}", async context =>
{
   var id = int.Parse((string)context.Request.RouteValues["id"]);
   var author = _authors.Find(x=> x.Id == id);
   var response = JsonSerializer.Serialize(author);
   await context.Response.WriteAsync(response);
});

Créer un enregistrement à l'aide de services légers dans ASP.NET Core

Pour ajouter des données à l'aide d'un point de terminaison HTTP Post, vous pouvez tirer parti de la méthode d'extension MapPost comme indiqué ci-dessous.

endpoints.MapPost("/", async context =>
{
    var author = await context.Request.ReadFromJsonAsync<Author>();
    _authors.Add(author);
    var response = JsonSerializer.Serialize(author);
    await context.Response.WriteAsync(response);
});

Supprimer un enregistrement à l'aide de services légers dans ASP.NET Core

Pour supprimer des données, vous pouvez profiter de la méthode d'extension MapDelete comme indiqué ci-dessous.

endpoints.MapDelete("/authors/{id:int}", async context =>
{
    var id = int.Parse((string)context.Request.RouteValues["id"]);
    var author = _authors.Find(x => x.Id == id);
    _authors.Remove(author);
    var response = JsonSerializer.Serialize(_authors);
    await context.Response.WriteAsync(response);
});

Configurer la méthode pour les services légers dans ASP.NET Core

Voici le code source complet de la méthode Configure de la classe Startup :

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
   if (env.IsDevelopment())
   {
        app.UseDeveloperExceptionPage();
   }
   app.UseRouting();
   app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
   await context.Response.WriteAsync("Hello World!");
});
endpoints.MapGet("/authors", async context =>
{
    var authors = _authors == null ? new List<Author>() : _authors;
    var response = JsonSerializer.Serialize(authors);
    await context.Response.WriteAsync(response);
});
endpoints.MapGet("/authors/{id:int}", async context =>
{
    var id = int.Parse((string)context.Request.RouteValues["id"]);
    var author = _authors.Find(x=> x.Id == id);
    var response = JsonSerializer.Serialize(author);
    await context.Response.WriteAsync(response);
});
endpoints.MapPost("/", async context =>
{
    var author = await context.Request.ReadFromJsonAsync<Author>();
    _authors.Add(author);
    var response = JsonSerializer.Serialize(author);
    await context.Response.WriteAsync(response);
});
endpoints.MapDelete("/authors/{id:int}", async context =>
{
    var id = int.Parse((string)context.Request.RouteValues["id"]);
    var author = _authors.Find(x => x.Id == id);
    _authors.Remove(author);
    var response = JsonSerializer.Serialize(_authors);
    await context.Response.WriteAsync(response);
});
   });
}

Créer des services légers dans la classe Program dans ASP.NET Core

Il existe un autre moyen de créer des services légers dans ASP.NET 6. Lorsque vous créez un nouveau projet vide ASP.NET Core 6, le fichier Startup.cs n'est pas créé par défaut. Ainsi, vous pouvez écrire votre code pour créer des services légers dans le fichier Program.cs. Voici un exemple qui illustre comment vous pouvez procéder :

app.MapGet("/", () => "Hello World!");
app.MapDelete("/{id}", (Func<int, bool>)((id) => {
    //Write your code to delete record here
    return true;
}));
    app.MapPost("/", (Func<Author, bool>)((author) => {
   //Write your code to add a new record here
    return true;
}));
app.Run();

Les services légers ou les API n'ont pas de modèle et n'ont pas besoin d'une classe de contrôleur pour les créer. Vous pouvez créer de tels services dans la classe Démarrage ou Programme.

Si vous souhaitez implémenter l'autorisation dans les services légers présentés dans cet article, vous devez tirer parti de la méthode d'extension RequireAuthorization de l'interface IEndpointConventionBuilder.