Inserimento di dipendenze in controller in ASP.NET CoreDependency injection into controllers in ASP.NET Core

Di Shadi Namrouti, Rick Anderson e Steve SmithBy Shadi Namrouti, Rick Anderson, and Steve Smith

I controller ASP.NET Core MVC richiedono le proprie dipendenze in modo esplicito tramite costruttori.ASP.NET Core MVC controllers request dependencies explicitly via constructors. ASP.NET Core include il supporto predefinito per l'inserimento di dipendenze.ASP.NET Core has built-in support for dependency injection (DI). L'inserimento delle dipendenze rende più facile testare e gestire le app.DI makes apps easier to test and maintain.

Visualizzare o scaricare il codice di esempio (procedura per il download)View or download sample code (how to download)

Inserimento di costruttoriConstructor Injection

I servizi vengono aggiunti come parametri del costruttore e il runtime risolve il servizio dal contenitore di servizi.Services are added as a constructor parameter, and the runtime resolves the service from the service container. In genere i servizi vengono definiti tramite interfacce.Services are typically defined using interfaces. Si consideri ad esempio un'app che richiede l'ora corrente.For example, consider an app that requires the current time. L'interfaccia seguente espone il servizio IDateTime:The following interface exposes the IDateTime service:

public interface IDateTime
{
    DateTime Now { get; }
}

Il codice seguente implementa l'interfaccia IDateTime:The following code implements the IDateTime interface:

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

Aggiungere il servizio al contenitore di servizi:Add the service to the service container:

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

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

Per altre informazioni su AddSingleton, vedere le durate dei servizi di inserimento delle dipendenze.For more information on AddSingleton, see DI service lifetimes.

Il codice seguente visualizza un messaggio di saluto all'utente in base all'orario: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();
    }

Eseguire l'app e verrà visualizzato un messaggio in base all'orario.Run the app and a message is displayed based on the time.

Inserimento di azioni con FromServicesAction injection with FromServices

FromServicesAttribute consente di inserire un servizio direttamente in un metodo di azione senza usare l'inserimento del costruttore: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();
}

Accedere alle impostazioni da un controllerAccess settings from a controller

L'accesso alle impostazioni di un'app o alle impostazioni di configurazione da un controller è un tipo di azione comune.Accessing app or configuration settings from within a controller is a common pattern. Il modello di opzioni descritto in Modello di opzioni in ASP.NET Core rappresenta l'approccio consigliato per gestire le impostazioni.The options pattern described in Modello di opzioni in ASP.NET Core is the preferred approach to manage settings. In linea generale, non inserire direttamente IConfiguration in un controller.Generally, don't directly inject IConfiguration into a controller.

Creare una classe che rappresenta le opzioni.Create a class that represents the options. Ad esempio:For example:

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

Aggiungere la classe di configurazione alla raccolta di servizi: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);
}

Configurare l'app per leggere le impostazioni da un file in formato 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>();
}

Il codice seguente richiede le impostazioni IOptions<SampleWebSettings> dal contenitore dei servizi e le usa nel metodo 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();
    }
}

Risorse aggiuntiveAdditional resources