相关文档:Startup
Startup类
Startup类用来配置应用的服务和请求管道:
- 通过ConfigureServices方法配置Application需要用到的服务
- 通过Configure方法配置Application请求管道
Startup的调用
- 在
Porgram
类里通过WebHostBuilder的扩展方法UseStartup<Tstartup>
来使用
Startup的构造函数
Startup构造函数可以包含已经被host依赖注入了的两个类:HostingEnvironment 和 Configuration
当然Startup的构造函数的重载按照需求自行添加删除参数
- 通过IHostingEnvironment可以针对当前应用环境来配置相关服务
- 通过IConfiguration在Startup期间获取应用的相关配置
小提示:
1.以上是通过HostingEnvironment来区分环境从而达到对某些特定服务的配置注入,当然我们也可以对Startup来动刀子,只需要对Startup进行重命名,比如开发环境时,对应新建StartupDeployment.cs,正式环境时,新建StartupProduction.cs,那么当应用在运行时,会自行根据当前的环境去调用对应环境的Startup类文件。
2.如果你同时新建了Startup.cs文件和StartupDeployment.cs文件,那么如果应用运行在开发环境时,会选择StartupDeployment.cs进行加载执行
ConfigureService方法
ConfigureService方法:给应用程序添加服务到服务容器(DI)中去
- 可选择的
- 被webhost调用,且一定在Configure方法之前被调用,从而去配置应用服务
- 在Configure方法之前调用的原因是,Configure方法中可能会用到ConfigureService中配置的服务类
- 按照一定的规约去配置
- 当然一些很基础的类并不是由ConfigureService去添加的,就比如说之前提到的HostingEnvironment和Configuration类,这些类是WebHost调用Startup方法之前注册的,具体可以参照Hosting
关于AspNetCore自带的依赖注入方式,可以去查阅ISerivceCollection的相关内容
或者蒋老师的博客IOC
Configure方法
Configure方法:用来特定应用如何对HttpRequest请求进行响应
- 请求管道是通过给ApplicationBuilder实例添加中间件来实现配置的
- ApplicationBuilder在Configure方法中是可以使用的,但是它并不是在ConfigureService方法中去配置注入的,而是通过Hosting直接创建并传递给Configure方法直接使用
ApplicationBuilder的扩展方法Use方法,没被调用一次就意味着给请求管道添加一道中间件。比如说,app.UseMvc就配置MVC作为默认管道处理句柄
在整个请求管道中,每一个管道除了负责处理相关逻辑之外,还负责去唤起下一个管道的执行
链式传递
Startupl类无非是通过ConfigureService方法和Configure方法来配置应用服务和请求管道的,那么对于Startup的本质抓住了,我们就可以直接在Program类里面通过链式传递的法则一步步将实例传递下去,在每一步做好相应的服务注册和请求管道配置即可
public class Program
{
public static IHostingEnvironment HostingEnvironment { get; set; }
public static IConfiguration Configuration { get; set; }
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
HostingEnvironment = hostingContext.HostingEnvironment;
Configuration = config.Build();
})
.ConfigureServices(services =>
{
services.AddMvc();
})
.Configure(app =>
{
if (HostingEnvironment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
// Configuration is available during startup. Examples:
// Configuration["key"]
// Configuration["subsection:suboption1"]
app.UseMvcWithDefaultRoute();
app.UseStaticFiles();
})
.Build();
}
Startup Filters
使用IStartupFilter可以很方便地在Configure方法中配置的中间层管道之前或之后添加中间件
- 定义中间件类
- 集成IStartupFilter实现Filter类,并在其中使用定义的中间类
- 在ConfigureService方法中注册你是先的Filter类,以便后续需要使用到