Dependency Injection in Controller in ASP.NET CoreDependency injection into controllers in ASP.NET Core

Von Shadi Namrouti, Rick Anderson und Steve SmithBy Shadi Namrouti, Rick Anderson, and Steve Smith

ASP.NET Core MVC-Controller fordern Abhängigkeiten explizit über Konstruktoren an.ASP.NET Core MVC controllers request dependencies explicitly via constructors. ASP.NET Core verfügt über integrierte Unterstützung für Dependency Injection ( DI).ASP.NET Core has built-in support for dependency injection (DI). DI erleichtert das Testen und die Wartung von Apps.DI makes apps easier to test and maintain.

Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)View or download sample code (how to download)

Constructor InjectionConstructor Injection

Dienste werden als Konstruktorparameter hinzugefügt, und die Runtime löst den Dienst aus dem Dienstcontainer auf.Services are added as a constructor parameter, and the runtime resolves the service from the service container. Dienste werden meist mithilfe von Schnittstellen definiert.Services are typically defined using interfaces. Stellen Sich sich z.B. eine App vor, für die die aktuelle Uhrzeit erforderlich ist.For example, consider an app that requires the current time. Die folgende Schnittstelle macht den IDateTime-Dienst verfügbar:The following interface exposes the IDateTime service:

public interface IDateTime
{
    DateTime Now { get; }
}

Im folgenden Code wird die IDateTime-Schnittstelle implementiert:The following code implements the IDateTime interface:

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

Fügen Sie anschließend dem Dienstcontainer den Dienst hinzu:Add the service to the service container:

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

    services.AddControllersWithViews();
}

Weitere Informationen zu AddSingleton finden Sie unter Dependency Injection in ASP.NET Core.For more information on AddSingleton, see DI service lifetimes.

Im folgenden Code sehen Sie eine Begrüßung des Benutzers, die sich an der jeweiligen Tageszeit orientiert: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();
    }

Führen Sie die App aus, und eine Nachricht wird angezeigt, die von der Tageszeit abhängt.Run the app and a message is displayed based on the time.

Action Injection mit FromServicesAction injection with FromServices

Mit dem FromServicesAttribute ist es möglich, einen Dienst direkt in eine Aktionsmethode einzufügen, ohne eine Constructor Injection verwenden zu müssen:The FromServicesAttribute enables injecting a service directly into an action method without using constructor injection:

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

Zugreifen auf Einstellungen von einem ControllerAccess settings from a controller

Das Zugreifen auf App- oder Konfigurationseinstellungen von einem Controller aus ist ein häufiges Szenario.Accessing app or configuration settings from within a controller is a common pattern. Das in Optionsmuster in ASP.NET Core beschriebene Optionsmuster ist der bevorzugte Ansatz, um Einstellungen zu verwalten.The options pattern described in Optionsmuster in ASP.NET Core is the preferred approach to manage settings. Fügen Sie generell IConfiguration nicht direkt in einen Controller ein.Generally, don't directly inject IConfiguration into a controller.

Erstellen Sie eine Klasse, die die Optionen darstellt.Create a class that represents the options. Beispiel:For example:

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

Hinzufügen der Konfigurationsklasse in die Dienstauflistung:Add the configuration class to the services collection:

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

    services.AddControllersWithViews();
}

Konfigurieren Sie die App, sodass sie die Einstellungen aus einer Datei mit JSON-Formatierung liest:Configure the app to read the settings from a JSON-formatted file:

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddJsonFile("samplewebsettings.json",
                    optional: false,
                    reloadOnChange: true);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Der folgende Code fordert die IOptions<SampleWebSettings>-Einstellungen aus dem Dienstcontainer an, und verwendet sie in der Index-Methode: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();
    }
}

Zusätzliche RessourcenAdditional resources

Von Shadi Namrouti, Rick Anderson und Steve SmithBy Shadi Namrouti, Rick Anderson, and Steve Smith

ASP.NET Core MVC-Controller fordern Abhängigkeiten explizit über Konstruktoren an.ASP.NET Core MVC controllers request dependencies explicitly via constructors. ASP.NET Core verfügt über integrierte Unterstützung für Dependency Injection ( DI).ASP.NET Core has built-in support for dependency injection (DI). DI erleichtert das Testen und die Wartung von Apps.DI makes apps easier to test and maintain.

Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)View or download sample code (how to download)

Constructor InjectionConstructor Injection

Dienste werden als Konstruktorparameter hinzugefügt, und die Runtime löst den Dienst aus dem Dienstcontainer auf.Services are added as a constructor parameter, and the runtime resolves the service from the service container. Dienste werden meist mithilfe von Schnittstellen definiert.Services are typically defined using interfaces. Stellen Sich sich z.B. eine App vor, für die die aktuelle Uhrzeit erforderlich ist.For example, consider an app that requires the current time. Die folgende Schnittstelle macht den IDateTime-Dienst verfügbar:The following interface exposes the IDateTime service:

public interface IDateTime
{
    DateTime Now { get; }
}

Im folgenden Code wird die IDateTime-Schnittstelle implementiert:The following code implements the IDateTime interface:

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

Fügen Sie anschließend dem Dienstcontainer den Dienst hinzu:Add the service to the service container:

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

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

Weitere Informationen zu AddSingleton finden Sie unter Dependency Injection in ASP.NET Core.For more information on AddSingleton, see DI service lifetimes.

Im folgenden Code sehen Sie eine Begrüßung des Benutzers, die sich an der jeweiligen Tageszeit orientiert: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();
    }

Führen Sie die App aus, und eine Nachricht wird angezeigt, die von der Tageszeit abhängt.Run the app and a message is displayed based on the time.

Action Injection mit FromServicesAction injection with FromServices

Mit dem FromServicesAttribute ist es möglich, einen Dienst direkt in eine Aktionsmethode einzufügen, ohne eine Constructor Injection verwenden zu müssen: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();
}

Zugreifen auf Einstellungen von einem ControllerAccess settings from a controller

Das Zugreifen auf App- oder Konfigurationseinstellungen von einem Controller aus ist ein häufiges Szenario.Accessing app or configuration settings from within a controller is a common pattern. Das in Optionsmuster in ASP.NET Core beschriebene Optionsmuster ist der bevorzugte Ansatz, um Einstellungen zu verwalten.The options pattern described in Optionsmuster in ASP.NET Core is the preferred approach to manage settings. Fügen Sie generell IConfiguration nicht direkt in einen Controller ein.Generally, don't directly inject IConfiguration into a controller.

Erstellen Sie eine Klasse, die die Optionen darstellt.Create a class that represents the options. Beispiel:For example:

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

Hinzufügen der Konfigurationsklasse in die Dienstauflistung: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);
}

Konfigurieren Sie die App, sodass sie die Einstellungen aus einer Datei mit JSON-Formatierung liest: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>();
}

Der folgende Code fordert die IOptions<SampleWebSettings>-Einstellungen aus dem Dienstcontainer an, und verwendet sie in der Index-Methode: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();
    }
}

Zusätzliche RessourcenAdditional resources