Startup 类

时间:2024-05-05 19:37:14

Startup 类的作用:

  1. 配置应用所需的任何服务
  2. 定义请求处理管道
  3. 配置(或注册)服务的代码添加到Startup.ConfigureServices方法中。服务是应用使用的组件。例如,Entity Framework Core上下文对象是一项服务。
  4. 配置请求处理管道的代码添加到Startup.Configure方法中。管道有一系列中间件组建组成。例如,中间件可能处理对静态文件的请求或将HTTP请求重定向到HTTPS。每个中间件在HttpContext上执行异步操作,然后调用管道中的下一个中间件或终止请求。
    public class Startup
    {
    public void ConfigureServices(IServiceCollection services)
    {
    services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddDbContext<MovieContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("MovieDb")));
    } public void Configure(IApplicationBuilder app)
    {
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseMvc();
    }
    }

    在构建应用的主机时,系统为应用指定Startup类。在Program类的主机生成器上调用BUild时,将生成应用的主机。通常在主机生成器上调用WebHostBuilderExtensions.UseStartup<TStartup> 方法来指定Startup类;

public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build(); using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider; try
{
var context = services.
GetRequiredService<RazorPagesMovieContext>();
context.Database.Migrate();
SeedData.Initialize(services);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
} host.Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}

在 Startup类中注入依赖关系的常见用途为注入:

  • IHostingEnvironment 按环境配置服务
  • IConfiguration  读取配置
  • ILoggerFactory 在记录器中创建Startup.ConfigureServices.
        private readonly IHostingEnvironment _env;
ILogger _logger;
public Startup(IHostingEnvironment env, ILoggerFactory loggerFactory, IConfiguration configuration)
{
_env = env;
_logger = loggerFactory.CreateLogger<Filters>();
Configuration = configuration;
}

ConfigureServices方法

主机可能会在调用Startup方法之前配置某些服务。

对于需要大量设置的功能,IServiceCollection 上有 Add{Service} 扩展方法。 典型 ASP.NET Core 应用将为实体框架、标识和 MVC 注册服务:

 public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
services.AddMvc(options =>
{
options.Filters.Add(new Filters(_logger));
});
}

将服务添加到服务容器,使其在应用和Configure方法中可用

Configure方法

Configure 方法用于指定应用响应 HTTP 请求的方式。可通过将中间件组建添加到IApplicationBuilder 实例来配置请求管道。

ASP.NET Core 模板配置的管道支持:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
} app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy(); app.UseMvc();
}

每个Use扩展方法将一个或多个中间件组件添加到请求管道。 例如,UseMvc()扩展方法将路由中间件添加到请求管道,并将 MVC 配置为默认处理程序。

请求管道中的每个中间件组件负责调用管道中的下一个组件,或在适当情况下使链发生短路。如果中间件链中未发生短路,则每个中间件都有第二次机会再将请求发送到客户端前处理该请求。