Aller au contenu principal

23-4 Créer un projet Shared

Certains aspects du code seront partagés entre le projet d'API, le projet Admin et le projet MVC.

Par exemple, autant l'API que le projet MVC auront besoin d'appeler les services pour effectuer des demandes à la BD.

Le code propre aux services est déjà dans son propre projet, donc on peut l'utiliser dans le projet d'API et c'est parfait. Cependant, le projet API n'a pas accès aux services via l'injection de dépendances puisque ces derniers sont configurés dans le fichier Program.cs de Snowfall.Web.Mvc.

Nous allons sortir l'injection de dépendances du projet Web.Mvc pour la mettre dans un projet Shared. Go, un autre projet! 😅

Créer le projet Shared

  1. Clic droit sur la solution Snowfall -> Add -> New Project...
  2. Dans le menu de gauche, choisir Class Library
  3. Nommez le projet Snowfall.Shared
  4. Appuyer sur Create
  5. Supprimez Class1.cs du projet

Ajouter une référence aux projets Application et Data

Comme les services que nous injectons sont essentiellement des services et des repositories, ces derniers proviennent de deux couches:

  • Application
  • Data

Ajoutons au projet Shared les références à ces deux autres projets.

  1. Clic droit sur Snowfall.Shared -> Add -> Reference...
  2. Cocher Snowfall.Application et Snowfall.Data
  3. Cliquer sur Add

Ajouter une référence au projet Shared

Finalement, dans les projets Snowfall.Web.Api et Snowfall.Web.Mvc, ajoutez une référence à Snowfall.Shared.

  1. Clic droit sur Snowfall.Web.Mvc -> Add -> Reference...
  2. Cocher Snowfall.Shared
  3. Cliquer sur Add
  4. Répéter pour Snowfall.Web.Api

Créer une extension ConfigInjectionDependances

L'idée ici est que nous allons créer une extension à IServiceCollection qu'il sera possible d'appeler autant dans le projet Api que Mvc. Cette dernière sera responsable d'enregistrer les différents services pour l'injection de dépendances.

Dans le projet Shared:

  1. Clic droit sur Snowfall.Shared -> Add -> Class/Interface
  2. Nommez la classe ConfigInjectionDependances
  3. Assurez vous que la classe est static (une extension fonctionne seulement avec une classe statique) et ajoutez une fonction EnregistrerServices qui sera responsable d'enregistrer les services pour l'injection de dépendances.
    Snowfall.Shared/ConfigInjectionDependances.cs
    namespace Snowfall.Shared;

    public static class ConfigInjectionDependances
    {
    public static IServiceCollection EnregistrerServices(this IServiceCollection services)
    {
    if (services == null)
    throw new ArgumentNullException(nameof(services));

    return services;
    }
    }

Enregistrer les services à partir de l'extension

Comme l'extension sera responsable de l'injection de dépendances, vous pouvez prendre tous les enregistrements de services/repositories (excluant Identity qui est un peu particulier) dans le fichier Program.cs de Snowfall.Web.Mvc pour les déplacer dans l'extension.

Snowfall.Shared/ConfigInjectionDependances.cs
public static class ConfigInjectionDependances
{
public static IServiceCollection EnregistrerServices(this IServiceCollection services)
{
if (services == null)
throw new ArgumentNullException(nameof(services));

// Data
services.AddSingleton<DapperContext>();
services.AddScoped<IEvenementRepository, EvenementRepository>();
services.AddScoped<IVilleRepository, VilleRepository>();
services.AddScoped<IQuestionRepository, QuestionRepository>();
services.AddScoped<IAchatRepository, AchatRepository>();

// Application
services.AddScoped<IEvenementService, EvenementService>();
services.AddScoped<IVilleService, VilleService>();
services.AddScoped<IQuestionService, QuestionService>();
services.AddScoped<IAchatService, AchatService>();
services.AddScoped<IPrixService, PrixService>();

return services;
}
}

Utiliser l'extension dans Program.cs

Finalement, il ne suffit que d'utiliser l'extension dans Program.cs du projet Mvc, puis du projet Api!

Utiliser l'extension dans le projet Mvc

Snowfall.Web.Mvc/Program.cs
//...

// Injection de dépendances
builder.Services.EnregistrerServices();

//...

Utiliser l'extension dans le projet Api

Snowfall.Web.Api/Program.cs
//...

builder.Services.AddControllers();
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
builder.Services.AddOpenApi();

// Injection de dépendances
builder.Services.EnregistrerServices();

//...

Validation projet MVC

Comme nous venons d'apporter des modifications au projet MVC et à l'injection de dépendances, assurez-vous que votre projet MVC fonctionne toujours correctement.