简介
Startup 类包含一个可选的ConfigureServices方法,用来配置应用的服务。还包含一个Configure方法,来创建程序的请求处理管线。
当使用IHostBuilder时,只有以下三个服务能够注入Startup类的构造函数
- IWebHostEnvironment
- IHostEnvironment
- IConfiguration
大部分服务直到调用Configure方法后才能使用。
ConfigureService方法
- 可选
- 在Configure方法配置程序的服务之前由host调用
- 通常设置服务的选项 options
经常使用的服务IServiceCollection 有Add护展方法,例如AddDbContext, AddDefaultIdentity, AddEntityFrameworkStores, 和AddRazorPages。
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>(
options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddRazorPages();
}
将服务添加到容器后,程序和Configure方法就可以使用。服务通过DI或IApplicationBuilder的ApplicationServices来调用。
Configure方法
Configure方法指定程序如何响应Http请求。请求处理管线通过向IApplicationBuilder实例添加中间件来配置,IApplicationBuilder没有注册到IOC容器,Hosting创建一个IApplicationBuilder 直接传给Configure方法。
用过滤器扩展Startup
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;
}
public async Task Invoke(HttpContext httpContext)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
var option = httpContext.Request.Query["option"];
if (!string.IsNullOrWhiteSpace(option))
{
httpContext.Items["option"] = WebUtility.HtmlEncode(option)+444;
}
await _next(httpContext);
stopwatch.Stop();
Console.WriteLine("请求用时ms:"+stopwatch.ElapsedMilliseconds);
}
}
ConfigureServices中添加
services.AddTransient<IStartupFilter, MiddleWares.RequestSetOptionsStartupFilter>();