Injection de dépendances en .Net Core [ Partie 5 : Extensions]
Il existe de nombreuses extensions permettant d’étendre IServiceCollection. Prenons un exemple : Microsft.EntityFrameworkCore.
Si vous utilisez EntityFramework avec Sql Server, je vous invite à télécharger le package Microsoft.EntityFrameworkCore. Ce dernier ajoutera à votre projet une classe EntityFrameworkServiceCollectionExtensions qui contient une méthode AddDbContext et ses nombreuses surcharges.

Cette méthode permet par exemple, d’enregistrer vos DbContext en lui passant directement la ConnectionString, et d’ajouter un mécanisme de tentatives de reconnexion automatique dans le cas où le serveur SQL est temporairement indisponible.
services.AddDbContext<DatabaseContext>(options =>
{
options.UseSqlServer(connectionString,
sqlServerOptionsAction: sqlOptions =>
{
sqlOptions.EnableRetryOnFailure(maxRetryCount: 10);
});
});
Toutes les dépendances s’enregistrant dans une seule et même méthode ConfigureServices, nous allons rapidement nous retrouver avec une méthode à rallonge, ce que déteste un développeur. En effet, l’enregistrement de notre DbContext dans l’exemple ci-dessus prend à lui tout seul 8 lignes de code.
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddTransient<IOperationTransient, Operation.Operation>();
services.AddSingleton<IOperationSingleton, Operation.Operation>();
services.AddScoped<IOperationScoped, Operation.Operation>();
services.AddTransient<IOperationService, OperationService>();
services.AddDbContext<DatabaseContext>(options =>
{
options.UseSqlServer("connectionString",
sqlServerOptionsAction: sqlOptions =>
{
sqlOptions.EnableRetryOnFailure(maxRetryCount: 10);
});
});
}
Afin que le contenu de cette méthode ne vous empêche pas de dormir, nous allons créer une classe pour étendre l’interface IServiceCollection. Notre classe, qui s’appellera IServiceCollectionExtensions, ne contiendra que des méthodes d’extension.
Dans notre méthode ConfigureServices, nous faisons 3 choses différentes :
- On ajoute l’utilisation des pages Razor
- On enregistre nos dépendances IOperation
- On ajoute un DB Context
AddRazorPages() ne prenant qu’une seule ligne, pas besoin d’y toucher. Nous allons donc créer deux méthodes d’extension : Une première pour les dépendances IOperation, et une seconde pour l’ajout du DBContext.
public static class IServiceCollectionExtensions
{
public static IServiceCollection AddOperationDependencies(this IServiceCollection services)
{
services.AddTransient<IOperationTransient, Operation.Operation>();
services.AddSingleton<IOperationSingleton, Operation.Operation>();
services.AddScoped<IOperationScoped, Operation.Operation>();
services.AddTransient<IOperationService, OperationService>();
return services;
}
public static IServiceCollection AddDataAccessServices(this IServiceCollection services, string connectionString)
{
services.AddDbContext<DatabaseContext>(options =>
{
options.UseSqlServer(connectionString,
sqlServerOptionsAction: sqlOptions => { sqlOptions.EnableRetryOnFailure(maxRetryCount: 10); });
});
return services;
}
}
Il ne reste plus qu’à refaire notre méthode ConfigureServices pour qu’elle soit bien plus lisible.
public void ConfigureServices(IServiceCollection services)
{
services.AddOperationDependencies()
.AddDataAccessServices("connectionString")
.AddRazorPages();
}
Dans la prochaine, et dernière étapes de ce tutoriel, nous allons voir qu’il est possible d’utiliser votre container IOC favori dans votre projet .Net Core.