使用泛型主机 (IHostBuilder) 时,只能将以下服务类型注入 Startup
构造函数:
不使用 Startup
类,请在主机生成器上调用 ConfigureServices
和 Configure
便捷方法
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) => { }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureServices(services => { services.AddControllersWithViews(); }) .Configure(app => { var loggerFactory = app.ApplicationServices .GetRequiredService<ILoggerFactory>(); var logger = loggerFactory.CreateLogger<Program>(); var env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>(); var config = app.ApplicationServices.GetRequiredService<IConfiguration>(); logger.LogInformation("Logged in Configure"); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } var configValue = config["MyConfigKey"]; }); }); }); }
使用 Startup 筛选器扩展 Startup
使用 IStartupFilter:用于将默认值添加到管道的开头,无需显式调用 Use{Middleware}
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) => { }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) .ConfigureServices(services => { services.AddTransient<IStartupFilter, RequestSetOptionsStartupFilter>(); }); } public class RequestSetOptionsStartupFilter : IStartupFilter { public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next) { return builder => { builder.UseMiddleware<RequestSetOptionsMiddleware>(); next(builder); }; } } public class RequestSetOptionsMiddleware { private readonly RequestDelegate _next; public RequestSetOptionsMiddleware( RequestDelegate next ) { _next = next; } // Test with https://localhost:5001/Privacy/?option=Hello public async Task Invoke(HttpContext httpContext) { var option = httpContext.Request.Query["option"]; if (!string.IsNullOrWhiteSpace(option)) { httpContext.Items["option"] = WebUtility.HtmlEncode(option); } await _next(httpContext); } }
当 ASP.NET Core 应用启动时,Startup 类启动应用。 应用可以为不同的环境定义多个 Startup
类。 在运行时选择适当的 Startup
类。 优先考虑名称后缀与当前环境相匹配的类。 如果找不到匹配的 Startup{EnvironmentName}
,就会使用 Startup
类。 当应用需要为各环境之间存在许多代码差异的多个环境配置启动时,这种方法非常有用。 典型的应用不需要这种方法。
使用接受程序集名称的 UseStartup(IWebHostBuilder, String) 重载:
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) { var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName; return Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(assemblyName); }); } }
Configure 和 ConfigureServices 支持窗体 Configure<EnvironmentName>
和 Configure<EnvironmentName>Services
的环境特定版本。 当应用需要为多个环境(每个环境有许多代码差异)配置启动时,这种方法就非常有用