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 droit
sur la solutionSnowfall
->Add
->New Project...
- Dans le menu de gauche, choisir
Class Library
- Nommez le projet
Snowfall.Shared
- Appuyer sur
Create
- 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.
Clic droit
surSnowfall.Shared
->Add
->Reference...
- Cocher
Snowfall.Application
etSnowfall.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 droit
surSnowfall.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 fonctionEnregistrerServices
qui 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.