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
Clic droitsur la solutionSnowfall->Add->New Project...- Dans le menu de gauche, choisir
Class Library - Nommez le projet
Snowfall.Shared - Appuyer sur
Create - Supprimez
Class1.csdu 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.
Clic droitsurSnowfall.Shared->Add->Reference...- Cocher
Snowfall.ApplicationetSnowfall.Data - 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.
Clic droitsurSnowfall.Web.Mvc->Add->Reference...- Cocher
Snowfall.Shared - Cliquer sur
Add - 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:
- Clic droit sur
Snowfall.Shared->Add->Class/Interface - Nommez la classe
ConfigInjectionDependances - Assurez vous que la classe est
static(une extension fonctionne seulement avec une classe statique) et ajoutez une fonctionEnregistrerServicesqui sera responsable d'enregistrer les services pour l'injection de dépendances.Snowfall.Shared/ConfigInjectionDependances.csnamespace 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.
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
//...
// Injection de dépendances
builder.Services.EnregistrerServices();
//...
Utiliser l'extension dans le projet Api
//...
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.