Injection de dépendances dans les contrôleurs dans ASP.NET CoreDependency injection into controllers in ASP.NET Core

Par Shadi Namrouti, Rick Anderson et Steve SmithBy Shadi Namrouti, Rick Anderson, and Steve Smith

Les contrôleurs ASP.NET Core MVC demandent les dépendances explicitement via des constructeurs.ASP.NET Core MVC controllers request dependencies explicitly via constructors. ASP.NET Core offre une prise en charge intégrée de l’injection de dépendances.ASP.NET Core has built-in support for dependency injection (DI). L’injection de dépendances facilite le test et la maintenance des applications.DI makes apps easier to test and maintain.

Affichez ou téléchargez l’exemple de code (procédure de téléchargement)View or download sample code (how to download)

Injection de constructeursConstructor Injection

Les services sont ajoutés sous forme de paramètre de constructeur, et le runtime résout les services à partir du conteneur de services.Services are added as a constructor parameter, and the runtime resolves the service from the service container. Les services sont généralement définis à partir d’interfaces.Services are typically defined using interfaces. Par exemple, prenons le cas d’une application qui a besoin de l’heure actuelle.For example, consider an app that requires the current time. L’interface suivante expose le service IDateTime :The following interface exposes the IDateTime service:

public interface IDateTime
{
    DateTime Now { get; }
}

Le code suivant implémente l’interface IDateTime :The following code implements the IDateTime interface:

public class SystemDateTime : IDateTime
{
    public DateTime Now
    {
        get { return DateTime.Now; }
    }
}

Ajoutez le service au conteneur de services :Add the service to the service container:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IDateTime, SystemDateTime>();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Pour plus d’informations sur AddSingleton, consultez Durée de vie des services d’injonction de dépendances.For more information on AddSingleton, see DI service lifetimes.

Le code suivant adresse une salutation à l’utilisateur qui varie en fonction de l’heure du jour :The following code displays a greeting to the user based on the time of day:

public class HomeController : Controller
{
    private readonly IDateTime _dateTime;

    public HomeController(IDateTime dateTime)
    {
        _dateTime = dateTime;
    }

    public IActionResult Index()
    {
        var serverTime = _dateTime.Now;
        if (serverTime.Hour < 12)
        {
            ViewData["Message"] = "It's morning here - Good Morning!";
        }
        else if (serverTime.Hour < 17)
        {
            ViewData["Message"] = "It's afternoon here - Good Afternoon!";
        }
        else
        {
            ViewData["Message"] = "It's evening here - Good Evening!";
        }
        return View();
    }

Exécutez l’application et un message s’affiche en fonction de l’heure.Run the app and a message is displayed based on the time.

Injection d’action avec FromServicesAction injection with FromServices

FromServicesAttribute permet d’injecter un service directement dans une méthode d’action sans utiliser l’injection de constructeurs :The FromServicesAttribute enables injecting a service directly into an action method without using constructor injection:

public IActionResult About([FromServices] IDateTime dateTime)
{
    ViewData["Message"] = $"Current server time: {dateTime.Now}";

    return View();
}

Accéder aux paramètres à partir d’un contrôleurAccess settings from a controller

L’accès aux paramètres de configuration ou d’application à partir d’un contrôleur est un modèle commun.Accessing app or configuration settings from within a controller is a common pattern. Le modèle options décrit dans Modèle d’options dans ASP.NET Core est l’approche à privilégier pour gérer les paramètres.The options pattern described in Modèle d’options dans ASP.NET Core is the preferred approach to manage settings. En règle générale, n’injectez pas directement IConfiguration dans un contrôleur.Generally, don't directly inject IConfiguration into a controller.

Créez une classe qui représente les options.Create a class that represents the options. Par exemple :For example:

public class SampleWebSettings
{
    public string Title { get; set; }
    public int Updates { get; set; }
}

Ajoutez la classe de configuration à la collection de services :Add the configuration class to the services collection:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IDateTime, SystemDateTime>();
    services.Configure<SampleWebSettings>(Configuration);
    
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Configurez l’application pour qu’elle lise les paramètres à partir d’un fichier au format JSON :Configure the app to read the settings from a JSON-formatted file:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.AddJsonFile("samplewebsettings.json", 
                                optional: false,        // File is not optional.
                                reloadOnChange: false);
        })
        .UseStartup<Startup>();
}

Le code suivant demande les paramètres IOptions<SampleWebSettings> au conteneur de services et les utilise dans la méthode Index :The following code requests the IOptions<SampleWebSettings> settings from the service container and uses them in the Index method:

public class SettingsController : Controller
{
    private readonly SampleWebSettings _settings;

    public SettingsController(IOptions<SampleWebSettings> settingsOptions)
    {
        _settings = settingsOptions.Value;
    }

    public IActionResult Index()
    {
        ViewData["Title"] = _settings.Title;
        ViewData["Updates"] = _settings.Updates;
        return View();
    }
}

Ressources supplémentairesAdditional resources