Startup启动类文件
ASP.NET Core应用程序与ASP.NET MVC等应用程序有所不同,它是模块化的,可配置化的。开发人员可以自定义需要的模块和功能,也可以自己实现自定义的模块。
这些模块化的配置都是在一个名为Startup.cs
的启动类文件中来完成。至于为什么使用Startup
作为启动类的名称,也是微软的官方约定,我们遵循即可。当然,这个启动类的名称也可以自定义,但需要同时修改应用程序入口的对应启动类文件名,比如我们将Startup.cs
修改为Bootstrap.cs
,那么我们需要修改Program.cs
入品配置,如下:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
修改为:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Bootstrap>();
使用Visual Studio或者.NET CLI脚手架生成的ASP.NET Core项目模板中也会自动生成Startup.cs
启动类文件。ASP.NET Core Razor Pages应用程序的启动类和ASP.NET Core MVC类似。
我们使用.NET CLI命令行创建一个新的Razor Pages项目,命令如下:
dotnet new razor -n razorpagedemo
在默认生成的Startup.cs
配置文件中,模板代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace razorpagedemo
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
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();
}
}
}
注:笔者编写本文时安装的.NET Coret版本为:
.NET Core 2.1.403
Startup.cs
类包含了几个方法:
- Startup(IConfiguration configuration):Startup类的构造函数
- ConfigureServices(IServiceCollection services): 此方法为可选配置,我们可以使用此方法为应用程序注册所需要的服务,如果没有特殊的服务,可以不创建
ConfigureServices
这个方法。 - Configure(IApplicationBuilder app, IHostingEnvironment env): 启动动项中必须有
Configure
方法以创建应用程序的请求处理管道。
在Startup构造函数中,服务主机提供了一些可用的服务。比如默认模板中的配置参数Configuration
,其他的应用程序需要的服务则需要我们通过ConfigureServices
这个方法来添加。所有这两个地方的服务均可以在整个应用程序生命周期中使用。
在了解了Startup
的大致结构之后,我们介绍两个主要方法:ConfigureServices
和Configure
分别是如何使用的。
ConfigureServices方法
ConfigureServices
方法的特征如下:
- 可选的
- 在
Configure
方法之前被服务主机调用,以便配置应用程序的所需服务 - 内置约定选项配置的地方
添加服务的典型模式是先调用Add{Service}
的方法,然后再调用services.Configure{Service}
方法,比如下图的注册和配置身份认证的服务:
我们通过向服务容器添加一个或者多个服务,使得这些服务在整个应用程序和Configure
方法中可用。
.NET Core也内置了很多服务,如默认模板中的AddMvc
服务:
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
其中AddMvc()
方法是向服务容器添加MVC的服务,SetCompatibilityVersion()
方法则是设置当前应用程序MVC兼容的版本,这个指定了兼容.NET Core 2.1。
.NET Core内置的服务截图:
在.NET Core中,我们自己的很多服务均是通过依赖注入(Dependency Injection)来解决的服务实例的。
关于依赖注入(简称:DI)是一种用来解除耦合的技术。在DI中,所有的实现均是有对应的接口类型的,一个接口也可有多个实现类。在
ConfigureServices
方法中注册接口与实现的对应关系,并将其他保存在一个类似字典的容器中,当这些抽象作为参数传递给方法(更多是构造函数)时,.NET Core内置的DI容器就将实例化对应的接口实现类型。
本节只是引出依赖注入(DI)这个概念,详细的依赖注入(DI)将在后面的章节中作介绍。
Configure方法
Configure
方法通常是用来指定.NET Core应用程序如何响应HTTP请求的。程序通过向IApplicationBuilder
实例添加中间件来配置请求管道。IApplicationBuilder
在Configure
方法中是可用的,但并未在DI服务容器中注册,也就是说我们不能通过DI容器来获取IApplicationBuilder
的实例。在运行的应用程序的服务主机将自动创建一个IApplicationBuilder
的实例并直接传递到Configure
方法中来。
在ASP.NET Corer的配置模板中,内置支持了如:
- app.UseDeveloperExceptionPage(): 开发环境的异常错误捕获页面
- app.UseExceptionHandler(“/Error”): 生产环境的异常错误页面
- app.UseStaticFiles(): 静态资源文件
- app.UseMvc(): MVC模式的请求处理及路由等
如下:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
});
}
其中调用的每一个Use
扩展方法即是在向请求管道添加一个中间件,就拿UseMvc
来举例,调用UseMvc
扩展方法表示向请求管道添加路由中间件并配置以MVC模式来处理所有的HTTP请求。
请求管道中的每个中间件组件负责调用管道中的下一个组件,或者在适当的情况下使链短路。如果中间件链中没有发生短路,在将请求发送到客户端之前 每个中间件都有第二次处理请求的机会。
对于一些其他服务,比如IHostingEnvironment
,ILoggerFactory
等等,也可以在Configure
这个方法中指定。如果指定了这些资源并且在可的情况下将注册这些服务到服务容器中。
不使用启动类(Startup)
ASP.NET Core 还提供一个便捷的方法来添加服务和配置应用程序请求处理管道,即在应用程序入口的CreateWebHostBuilder
方法中使用ConfigureServices
和Configure
方法,可以调用多次ConfigureServices
方法来追加注册服务,最后调用Configure
方法来配置已注册的服务,如下:
public class Program
{
public static IHostingEnvironment HostingEnvironment { get; set; }
public static IConfiguration Configuration { get; set; }
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
HostingEnvironment = hostingContext.HostingEnvironment;
Configuration = config.Build();
})
.ConfigureServices(services =>
{
services.AddMvc();
})
.Configure(app =>
{
var loggerFactory = app.ApplicationServices
.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("Logged in Configure");
if (HostingEnvironment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
// Configuration is available during startup. Examples:
// Configuration["key"]
// Configuration["subsection:suboption1"]
app.UseMvcWithDefaultRoute();
app.UseStaticFiles();
});
}
好了,本节ASP.NET Core Startup启动类的内容就为大家介绍到这里了。
我是Rector,我们下节再见。
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册