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

作者:Shadi Namrouti、 和 Steve Smith

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

查看或下载示例代码()

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

以下代码实现 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 的详细信息,请参阅 。

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

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

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

  1. public IActionResult About([FromServices] IDateTime dateTime)
  2. {
  3. return View();

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

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

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

将应用配置为从 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. reloadOnChange: false);
  13. .UseStartup<Startup>();
  14. }

以下代码从服务容器请求 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. }