【发布时间】:2020-07-12 12:25:42
【问题描述】:
Configure 方法在 ASP.NET Core 3.1 中就像魔术一样工作。
场景 1
创建新项目时,框架会为以下方法签名提供脚手架:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
应用程序使用此签名并不奇怪,因为我可以假设 ASP.NET Core 框架期望签名保持原样。
场景 2
去掉第二个参数IWebHostEnvironment:
public void Configure(IApplicationBuilder app)
应用程序有效。
场景 3
在 'ConfigureServices' 方法中将我的 DbContext 与记录器一起添加到 IServiceCollection 中:
public void Configure(IApplicationBuilder app, ILogger<Startup> logger, VegaDbContext vegaDbContext)
令人惊讶的是,应用程序有效。看起来该框架足以解析添加到服务集合的类型。好兆头。
Inline 是 ConfigureServices 方法的实现:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<VegaDbContext>(options =>
options.UseSqlServer(
configuration.GetConnectionString("VegaDb")));
services.AddControllers();
}
场景 4
注入 WeatherForecastController,我认为它是通过 services.AddControllers() 添加到 IServiceCollection 的:
public void Configure(IApplicationBuilder app, WeatherForecastController weatherForecastController)
应用程序不工作。抛出以下异常:
System.Exception: '无法解析服务类型 'Vega.Controllers.WeatherForecastController' 用于 类型上的方法“配置”的参数“天气预测控制器” 'Vega.Startup'。'
有人能解释一下方法调用实际上是如何由框架完成的,以及它如何能够解析像 ILogger 和 VegaDbContext 这样的少数类型,而不是 WeatherForecastController.
【问题讨论】:
标签: c# asp.net-web-api asp.net-core-3.1