ASP.NET Core Startup 类

Startup类

所有的ASP.NET Core应用都至少有一个Startup类,当应用启动时会在主程序集中搜索通过在主机生成器上调用 WebHostBuilderExtensions.UseStartup 方法来指定 Startup 类。
在这里插入图片描述
Startup类必须包含一个Configure方法(创建应用的请求处理管道)和一个可选的ConfigureServices方法(配置应用的服务,服务是一个提供应用功能的可重用组件),这两个方法都会在应用启动的时候被调用。
在这里插入图片描述
使用泛型主机 (IHostBuilder) 时,通过 Startup 构造函数也能也只能注入配置以下服务类型:

  • IWebHostEnvironment(提供有关应用程序正在其中运行的 web 宿主环境的信息)
  • IHostEnvironment(提供有关其中正在运行应用程序的宿主环境的信息)IWebHostEnvironment vs IHostEnvironment
  • IConfiguration(应用程序配置信息)
public class Startup
{
    private readonly IWebHostEnvironment _env;

    public Startup(IConfiguration configuration, IWebHostEnvironment env)
    {
    	//构造函数注入服务
        Configuration = configuration;
        _env = env;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        if (_env.IsDevelopment())
        {
        	//使用服务
        	string value= Configuration ["key"];
        }
        else
        {
        }
    }
}

除了使用IWebHostEnvironment服务对应用处于哪种环境判断再执行不同的逻辑之外处理之外,还可以通过Startup 类约定和ConfigureServices和Configure方法约定,为不同的环境执行不同的Startup类和ConfigureServices、Configure方法,方便不同环境切换管理。

Startup 类约定

当 ASP.NET Core 应用启动时,Startup 类启动应用。 应用可以为不同的环境定义多个 Startup 类。 在运行时选择适当的 Startup 类。 优先考虑名称后缀与当前环境相匹配的类。 如果找不到匹配的 Startup{EnvironmentName},就会使用 Startup 类。 当应用需要为各环境之间存在许多代码差异的多个环境配置启动时,这种方法非常有用。

    public class Startup
    {
        //配置应用的服务,服务是一个提供应用功能的可重用组件
        public void ConfigureServices(IServiceCollection services)
        {
        }
        //创建应用的请求处理管道
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });
        }
    }

    public class StartupDevelopment
    {
        private readonly IWebHostEnvironment _env;

        public StartupDevelopment(IWebHostEnvironment env)
        {
            _env = env;
        }

        public void ConfigureServices(IServiceCollection services)
        {
        }

        public void Configure(IApplicationBuilder app)
        {
            if (_env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("StartupDevelopment Hello World!");
                });
            });
        }
    }

    public class StartupProduction
    {
        private readonly IWebHostEnvironment _env;
        public StartupProduction(IWebHostEnvironment env)
        {
            _env = env;
        }

        public void ConfigureServices(IServiceCollection services)
        {
        }

        public void Configure(IApplicationBuilder app)
        {
            if (_env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("StartupProduction Hello World!");
                });
            });
        }
    }

使用Startup 类约定为不同的环境下执行不同定义的Startup 类,需要如下方法返回IHostBuilder对象
在这里插入图片描述

Startup 方法约定

除了使用Startup 类约定为不同的环境下执行不同定义的Startup 类之外,还可以使用Startup 方法约定为不同的环境下执行Startup 类下不同定义的 的ConfigureServices和Configure方法。以下为开发,分阶段,生产,默认的四种ConfigureServices和Configure约定命名方法
ConfigureDevelopmentServices
ConfigureStagingServices
ConfigureProductionServices
ConfigureServices

ConfigureDevelopment
ConfigureStaging
ConfigureProduction
Configure

ConfigureServices方法

对于需要大量设置的服务功能,IServiceCollection 上有 Add{Service} 扩展方法。 例如,AddDbContext、AddDefaultIdentity、AddEntityFrameworkStores 和 AddMvc等。也可以通过依赖注入配置自定义服务。服务通过依赖关系注入或 ApplicationServices 进行解析。将服务添加到服务容器,使其在应用和 Configure 方法中可用。

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    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();
    }

在启动时服务可用
ASP.NET Core 在应用程序启动期间提供了一些应用服务和对象。可以非常简单地使用这些服务,只需要在在 Startup 类的构造函数或是它的 Configure 与 ConfigureServices 方法中的一个包含合适的接口即可。下面定义了在 Startup 类中对每个方法可用的服务。框架服务和对象包括:
IApplicationBuilder
被用于构建应用程序的请求管道。只可以在 Startup 中的 Configure 方法里使用。

IApplicationEnvironment
提供了访问应用程序属性,类似于ApplicationName 、ApplicationVersion 以及 ApplicationBasePath。可以在 Startup 的构造函数和 Configure 方法中使用。

IHostingEnvironment
提供了当前的 EnvironmentName、WebRootPath 以及 Web 根文件提供者。可以在 Startup 的构造函数和 Configure 方法中使用。

ILoggerFactory
提供了创建日志的机制。可以在 Startup 的构造函数或 Configure 方法中使用。
IServiceCollection
当前容器中各服务的配置集合。只可在 ConfigureServices 方法中被使用,通过在该方法中配置可使服务在应用程序中可用。

Startup Constructor: IApplicationEnvironment IHostingEnvironment ILoggerFactory

ConfigureServices: IServiceCollection

Configure: IApplicationBuilder IApplicationEnvironment IHostingEnvironment ILoggerFactory

Configure方法

Configure 方法用于指定应用响应 HTTP 请求的方式。 可通过将中间件组件添加到 IApplicationBuilder 实例来配置请求管道。IApplicationBuilder 定义用于配置应用请求管道的类,ASP.NET Core 请求管道包含一系列请求委托,依次调用。

常见中间件顺序

  • 异常/错误处理
  • HTTP 严格传输安全协议
  • HTTPS 重定向
  • 静态文件服务器
  • Cookie 策略实施
  • 身份验证
  • 会话
  • MVC

每个 Use 扩展方法将一个或多个中间件组件添加到请求管道。 例如,UseStaticFiles 配置中间件提供静态文件。请求管道中的每个中间件组件负责调用管道中的下一个组件,或在适当情况下使链发生短路。Configure方法使用 IApplicationBuilder 来使用中间件有 Use 、Map、Run 三种使用方式:Use 使用中间件配置请求管道;Map 管道分支;Run 管道短路。

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

参考:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/startup?view=aspnetcore-5.0
https://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-3_1-application-startup.html#configureservices
https://zhuanlan.zhihu.com/p/180072052
https://www.cnblogs.com/whuanle/p/10095209.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值