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í
Přečtěte Logika kontroleru testů v ASP.NET Core si, jak usnadnit testování kódu explicitním vyžádáním závislostí v kontrolerů.
Nahraďte výchozí kontejner injektáže závislostí implementací třetí strany.
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í
Přečtěte Logika kontroleru testů v ASP.NET Core si, jak usnadnit testování kódu explicitním vyžádáním závislostí v kontrolerů.
Nahraďte výchozí kontejner injektáže závislostí implementací třetí strany.