在 ASP.NET Core 中将依赖项注入到控制器Dependency injection into controllers in ASP.NET Core

本文内容

作者:Shadi NamroutiRick AndersonSteve Smith

ASP.NET Core MVC 控制器通过构造函数显式请求依赖关系。ASP.NET Core 内置有对依赖关系注入 (DI) 的支持。DI 使应用更易于测试和维护。

查看或下载示例代码如何下载

构造函数注入Constructor Injection

服务作为构造函数参数添加,并且运行时从服务容器中解析服务。通常使用接口来定义服务。例如,考虑需要当前时间的应用。以下接口公开 IDateTime 服务:

  1. public interface IDateTime
  2. {
  3. DateTime Now { get; }
  4. }

以下代码实现 IDateTime 接口:

  1. public class SystemDateTime : IDateTime
  2. {
  3. public DateTime Now
  4. {
  5. get { return DateTime.Now; }
  6. }
  7. }

将服务添加到服务容器中:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddSingleton<IDateTime, SystemDateTime>();
  4. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  5. }

有关 AddSingleton 的详细信息,请参阅 DI 服务生存期

以下代码根据一天中的时间向用户显示问候语:

  1. public class HomeController : Controller
  2. {
  3. private readonly IDateTime _dateTime;
  4. public HomeController(IDateTime dateTime)
  5. {
  6. _dateTime = dateTime;
  7. }
  8. public IActionResult Index()
  9. {
  10. var serverTime = _dateTime.Now;
  11. if (serverTime.Hour < 12)
  12. {
  13. ViewData["Message"] = "It's morning here - Good Morning!";
  14. }
  15. else if (serverTime.Hour < 17)
  16. {
  17. ViewData["Message"] = "It's afternoon here - Good Afternoon!";
  18. }
  19. else
  20. {
  21. ViewData["Message"] = "It's evening here - Good Evening!";
  22. }
  23. return View();
  24. }

运行应用并且系统将根据时间显示一条消息。

FromServices 的操作注入Action injection with FromServices

FromServicesAttribute 允许将服务直接注入到操作方法,而无需使用构造函数注入:

  1. public IActionResult About([FromServices] IDateTime dateTime)
  2. {
  3. ViewData["Message"] = $"Current server time: {dateTime.Now}";
  4. return View();
  5. }

从控制器访问设置Access settings from a controller

从控制器中访问应用或配置设置是一种常见模式。中所述的选项模式是管理设置的首选方法ASP.NET Core 中的选项模式通常情况下,不直接将 IConfiguration 注入到控制器。

创建表示选项的类。例如:

  1. public class SampleWebSettings
  2. {
  3. public string Title { get; set; }
  4. public int Updates { get; set; }
  5. }

将配置类添加到服务集合中:

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

将应用配置为从 JSON 格式文件中读取设置:

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. CreateWebHostBuilder(args).Build().Run();
  6. }
  7. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  8. WebHost.CreateDefaultBuilder(args)
  9. .ConfigureAppConfiguration((hostingContext, config) =>
  10. {
  11. config.AddJsonFile("samplewebsettings.json",
  12. optional: false, // File is not optional.
  13. reloadOnChange: false);
  14. })
  15. .UseStartup<Startup>();
  16. }

以下代码从服务容器请求 IOptions<SampleWebSettings> 设置,并通过 Index 方法使用它们:

  1. public class SettingsController : Controller
  2. {
  3. private readonly SampleWebSettings _settings;
  4. public SettingsController(IOptions<SampleWebSettings> settingsOptions)
  5. {
  6. _settings = settingsOptions.Value;
  7. }
  8. public IActionResult Index()
  9. {
  10. ViewData["Title"] = _settings.Title;
  11. ViewData["Updates"] = _settings.Updates;
  12. return View();
  13. }
  14. }

其他资源Additional resources