作者:Shadi Namrouti、Rick Anderson 和 Steve Smith
ASP.NET Core MVC 控制器通过构造函数显式请求依赖关系。 ASP.NET Core 内置有对依赖关系注入 (DI) 的支持。 DI 使应用更易于测试和维护。
服务作为构造函数参数添加,并且运行时从服务容器中解析服务。 通常使用接口来定义服务。 例如,考虑需要当前时间的应用。 以下接口公开 IDateTime
服务:
public interface IDateTime { DateTime Now { get; } }
以下代码实现 IDateTime
接口:
public class SystemDateTime : IDateTime { public DateTime Now { get { return DateTime.Now; } } }
将服务添加到服务容器中:
public void ConfigureServices(IServiceCollection services) { services.AddSingleton<IDateTime, SystemDateTime>(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); }
有关 AddSingleton 的详细信息,请参阅 DI 服务生存期。
以下代码根据一天中的时间向用户显示问候语:
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(); }
运行应用并且系统将根据时间显示一条消息。
FromServicesAttribute 允许将服务直接注入到操作方法,而无需使用构造函数注入:
public IActionResult About([FromServices] IDateTime dateTime) { ViewData["Message"] = $"Current server time: {dateTime.Now}"; return View(); }
从控制器中访问应用或配置设置是一种常见模式。 ASP.NET Core 中的选项模式 中所述的选项模式是管理设置的首选方法。 通常情况下,不直接将 IConfiguration 注入到控制器。
创建表示选项的类。 例如:
public class SampleWebSettings { public string Title { get; set; } public int Updates { get; set; } }
将配置类添加到服务集合中:
public void ConfigureServices(IServiceCollection services) { services.AddSingleton<IDateTime, SystemDateTime>(); services.Configure<SampleWebSettings>(Configuration); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); }
将应用配置为从 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>(); }
以下代码从服务容器请求 IOptions<SampleWebSettings>
设置,并通过 Index
方法使用它们:
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(); } }
请参阅 ASP.NET Core 中的测试控制器逻辑,了解如何显式请求控制器中的依赖关系,以更轻松地测试代码。