Startup类
Startup类
1.ConfigureServices:配置(注册)引用的服务。服务是一个提供应用功能的可重用组件
2.Configure:创建应用的请求处理管道
3.在应用启动时,ANC运行时会调用ConfigureServices和Configure
4.主机提供Startup类构造函数可用的某些服务,应用通过ConfigureServices添加其他服务,主机和应用服务都可以在Configure和整个应用中使用
5.只能将IConfiguration,IHostEnvironment,IWebHostEnvironment这三个服务注入到Startup的构造函数
6.在调用Configure之前,大多数服务都不可用
7.应用为不同的环境单独定义Startup类时,相应的Startup类会在运行时被选中
ConfigureService
1.可选
2.在Configure方法配置应用服务之前,由主机调用
3.其中按常规设置配置选项
4.IServiceCollection上有Add扩展方法,将服务添加到服务容器,使其在应用和Configure方法中可用
Configure方法
1.用于指定应用响应HTTP请求的方式
2.通过将中间件组件添加到IApplicationBuilder实例来配置请求管道
3.每个Use扩展方法将一个或多个中间件组件添加到请求管道
4.请求管道中的每个中间件组件负责调用管道中的下一个组件,或在适当情况下使链路发生短路
5.可以在Configure方法签名中指定其他服务,如果这些服务可用,则会被注入
在不启动的情况下配置服务
1.可以不使用Startup类来配置服务和处理请求管道,直接在主机生成器上调用ConfigureServices和Configure,即直接在CreateHostBuilder中使用
2.多个ConfigureServices会叠加,多个Configure会覆盖,以最后一个为准
使用Startup筛选器扩展Startup
1.在应用的Configure中间件管道的开头或末尾使用IStartupFilter来配置中间件
2.IStartupFilter.Configure可以将中间件设置为在库添加的中间件之前或之后运行
3.每个IStartupFilter可以在请求管道好着呢个添加一个或多个中间件
4.筛选器按照添加到服务容器的顺序调用
5.筛选器可在将控件传递给下一个筛选器之前或之后添加中间件,从而附加到应用管道的开头或末尾
在启动时从外部程序集添加配置
可以通过IHostingStartup实现,从外部的程序集添加配置
依赖关系注入(服务)
注入启动的服务
1.只能将IConfiguration,IHostEnvironment,IWebHostEnvironment这三个服务注入到Startup的构造函数
2.普通服务可以注入到Startup.Configure
服务生命周期
1.Transient,每次从服务容器进行请求时创建
2.Scope,每一次HTTP连接创建一个
3.Singleton,在第一次请求时或者在ConfigureService创建
服务注册方法
services.AddTransient<ICustomService, CustomService>();
services.AddTransient<ICustomService>(c=> new CustomService());
services.AddTransient<CustomService>();
1.当一个接口对应对个不同的方法时,以最后一个方法为准。除非使用了TryAddTransient,在前面没有注册时,才使用
2.TryAddEnumerable仅当没有同一类型的实现时,才注册该服务
services.TryAddEnumerable(ServiceDescriptor.Transient<ICustomService, CustomService2>());
3.将服务注入到别的方法的构造函数时,必须有public构造函数。可以有参数,但是该参数必须有默认值
从main调用服务
var host = CreateHostBuilder(args).Build();
using(var serviceScope = host.Services.CreateScope())
{
var service = serviceScope.ServiceProvider;
var context = service.GetRequiredService<Operation>();
}
host.Run();
用以解析应用范围内的已设置范围的服务,比如数据库连接
设计能够进行依赖注入的服务
1.设计服务以使用依赖关系注入来获取其依赖关系
2.避免进行有状态的静态方法调用
3.避免在服务中直接实例化依赖类
4.不应在应用类中包含过多的内容
5.View应该关注用户的界面问题,而应将业务规则和数据访问实现细节移到别的特定的类中。要遵守单一责任原则
中间件
1.中间件是一种装配到应用管道以外处理请求和响应的软件。没个组件都可以选择是否将请求传递到管道的下一个组件,也可以在下一个组件的前后执行
2.请求委托用于生成请求管道。请求委托处理每个HTTP请求。
使用IApplicationBuilder创建中间件管道
在next前的逻辑是调用后面的组件前执行的,在next后的逻辑是调用后面的组件后执行的
顺序
1.异常/错误处理
2.HTTPS重定向中间件
3.静态文件中间件
4.Cooike策略中间件
5.路由请求中间件
6.身份验证中间件
7.授权中间件
8.会话中间件
9.终结点路由中间件
Use、Run、Map
1.Use方法可使管道短路(不调用next方法)
2.Run是一种约定,处在管道最后
3.Map扩展用作约定来创建管道分支。Map可以嵌套也可以同时匹配多个字段
app.Map("/map1", level1 =>
{
level1.Map("/map11", level2=>
{
level2.Run(async context =>
{
await context.Response.WriteAsync("map11");
});
});
});
app.Map("/map1/map11", level1 =>
{
level1.Run(async context =>
{
await context.Response.WriteAsync("map11");
});
});
4.MapWhen可以筛选,可以筛选path,也可以筛选query。
app.MapWhen(context=>
{
// /ma可以,/ma1不可以,/ma/mb可用
return context.Request.Path.StartsWithSegments("