Injektáž závislostí do kontrolerů v ASP.NET Core

Shadi Namrouti, Rick Andersona Steve Smith

ASP.NET Core Kontrolery MVC explicitně vyžádá závislosti prostřednictvím konstruktorů. ASP.NET Core má integrovanou podporu injektáže závislostí (DI). DI usnadňuje testování a údržbu aplikací.

Zobrazení nebo stažení ukázkového kódu (stažení)

Injektáž konstruktoru

Služby se přidávají jako parametr konstruktoru a modul runtime překládá službu z kontejneru služby. Služby se obvykle definují pomocí rozhraní. Představte si například aplikaci, která vyžaduje aktuální čas. Následující rozhraní službu IDateTime zpřístupňuje:

public interface IDateTime
{
    DateTime Now { get; }
}

Následující kód implementuje IDateTime rozhraní :

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

Přidejte službu do kontejneru služby:

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

    services.AddControllersWithViews();
}

Další informace o najdete AddSingleton v tématu Životnosti služeb pro di di.

Následující kód zobrazí uživateli pozdrav na základě denní doby:

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();
    }

Spusťte aplikaci a na základě času se zobrazí zpráva.

Injektáž akcí pomocí FromServices

Umožňuje vložit službu přímo do metody akce bez FromServicesAttribute použití injektáže konstruktoru:

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

Nastavení přístupu z kontroleru

Běžným vzorem je přístup k nastavení aplikace nebo konfigurace z kontroleru. Vzor možností popsaný v části je Vzor možností v ASP.NET Core upřednostňovaný přístup ke správě nastavení. Obecně platí, že do kontroleru IConfiguration neaplikujte přímo.

Vytvořte třídu, která představuje možnosti. Příklad:

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

Přidejte třídu konfigurace do kolekce služeb:

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

    services.AddControllersWithViews();
}

Nakonfigurujte aplikaci tak, aby četla nastavení ze souboru ve formátu JSON:

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>();
            });
}

Následující kód si IOptions<SampleWebSettings> vyžádá nastavení z kontejneru služby a použije je v Index metodě :

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();
    }
}

Další zdroje informací

Shadi Namrouti, Rick Andersona Steve Smith

ASP.NET Core Kontrolery MVC explicitně vyžádá závislosti prostřednictvím konstruktorů. ASP.NET Core má integrovanou podporu injektáže závislostí (DI). DI usnadňuje testování a údržbu aplikací.

Zobrazení nebo stažení ukázkového kódu (stažení)

Injektáž konstruktoru

Služby se přidávají jako parametr konstruktoru a modul runtime překládá službu z kontejneru služby. Služby se obvykle definují pomocí rozhraní. Představte si například aplikaci, která vyžaduje aktuální čas. Následující rozhraní službu IDateTime zpřístupňuje:

public interface IDateTime
{
    DateTime Now { get; }
}

Následující kód implementuje IDateTime rozhraní :

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

Přidejte službu do kontejneru služby:

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

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

Další informace o najdete AddSingleton v tématu Životnosti služeb pro di di.

Následující kód zobrazí uživateli pozdrav na základě denní doby:

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();
    }

Spusťte aplikaci a na základě času se zobrazí zpráva.

Injektáž akcí pomocí FromServices

Umožňuje vložit službu přímo do metody akce bez FromServicesAttribute použití injektáže konstruktoru:

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

    return View();
}

Nastavení přístupu z kontroleru

Běžným vzorem je přístup k nastavení aplikace nebo konfigurace z kontroleru. Vzor možností popsaný v části je Vzor možností v ASP.NET Core upřednostňovaný přístup ke správě nastavení. Obecně platí, že do kontroleru IConfiguration neaplikujte přímo.

Vytvořte třídu, která představuje možnosti. Příklad:

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

Přidejte třídu konfigurace do kolekce služeb:

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

Nakonfigurujte aplikaci tak, aby četla nastavení ze souboru ve formátu JSON:

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>();
}

Následující kód si IOptions<SampleWebSettings> vyžádá nastavení z kontejneru služby a použije je v Index metodě :

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();
    }
}

Další zdroje informací