应用程序启动配置方式
一、速通一图流
二、AppStartup 启动总结
AppStartup 是 Furion 框架中一种更加灵活的应用程序启动配置方式,它取代了传统的 ASP.NET Core Startup
类,使得应用配置更易于管理和扩展。
1. Startup 类(传统方式)
- .NET 5 的启动方式:
- 通过
Program.cs
中的UseStartup<TStartup>()
方法指定启动类。 Startup
类包含两个主要方法:ConfigureServices(IServiceCollection services)
:用于配置应用所需的服务。Configure(IApplicationBuilder app, IWebHostEnvironment env)
:用于配置应用的请求处理管道。
- 通过
- .NET 6 之后的变化:
- 微软在 .NET 6 中不再推荐使用
UseStartup<TStartup>()
,而是直接在Program.cs
中配置服务和中间件。
- 微软在 .NET 6 中不再推荐使用
2. AppStartup 概述
Furion 提供了更灵活的配置方式:AppStartup
,可以在任何项目层定义 Startup 配置,而不是将其绑定在 Web 应用层。
为什么要使用 AppStartup:
- 解耦 Startup 类:避免在每个 Web 应用层中重复配置 Startup 类。
- 减轻 Startup 类的臃肿:随着业务增长,Startup 类可能会变得复杂和难以维护。
- 共享配置:Startup 类配置可以在多个项目层之间共享。
注意:AppStartup 的派生类必须位于被启动层引用的项目中,否则不会被加载。
3. AppStartup 配置方法
方法约定:
- 任何公开、非静态、返回
void
且第一个参数为IServiceCollection
类型的方法,会被视为ConfigureServices
方法。 - 任何公开、非静态、返回
void
且第一个参数为IApplicationBuilder
,第二个参数为IWebHostEnvironment
的方法,会被视为Configure
方法。
public class MyStartup : AppStartup
{public void ConfigureServices(IServiceCollection services){services.AddDataValidation(); // 添加数据验证服务}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){app.UseSwagger(); // 启用 Swagger 中间件}
}
4. AppStartup 配置顺序
- 默认顺序:根据程序集名称的字母顺序进行正序调用。
- 自定义顺序:通过
[AppStartup(order)]
特性来定义顺序,order
数值越大,越先调用。
5. AppStartup 方法调用顺序
方法顺序: 在 AppStartup 中,方法的调用顺序与方法书写顺序一致,越靠前的方法越早调用。
6. Startup 配置最佳实践
v3.6.3+: Furion 从 v3.6.3+ 版本开始,支持 FakeStartup
模式,简化 Startup 类的配置。
推荐做法:
- Web 启动层的 Startup.cs 保持为空:
public class Startup
{public void ConfigureServices(IServiceCollection services) { }public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { }
}
- 将具体的配置迁移到 Web 核心层(如
Furion.Web.Core.Startup.cs
):
public sealed class FurWebCoreStartup : AppStartup
{// 配置应用程序所需的服务public void ConfigureServices(IServiceCollection services){services.AddCorsAccessor(); // 添加 CORS 服务,允许跨域请求services.AddControllers().AddInject(); // 添加 MVC 控制器和 Furion 的依赖注入扩展}// 配置应用程序的请求处理管道public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage(); // 开发环境下启用开发者异常页面}app.UseHttpsRedirection(); // 强制将 HTTP 请求重定向为 HTTPSapp.UseRouting(); // 启用路由中间件app.UseCorsAccessor(); // 启用 CORS 中间件app.UseAuthentication(); // 启用身份认证中间件app.UseAuthorization(); // 启用授权中间件app.UseInject(); // 使用 Furion 的依赖注入中间件app.UseEndpoints(endpoints =>{endpoints.MapControllers(); // 映射控制器路由});}
}
7. 构造函数注入说明
- AppStartup 派生类无法使用构造函数注入服务。
- 解决方案:
- 获取配置
IConfiguration
:通过App.Configuration
获取。 - 解析服务:通过
App.GetService<TService>()
或app.ApplicationServices.GetService<TService>()
获取服务。
- 获取配置
- Configure 方法自动注入:
IApplicationBuilder
和IWebHostEnvironment
参数会自动注入到Configure
方法中。
8. 关于 appsettings.json 配置
配置文件灵活性:
- Furion 允许在任意项目层的根目录下创建配置文件(如
dbsettings.json
),Furion 会自动合并所有配置。 - 注意:非启动层的配置文件不能命名为
appsettings.json
,否则会覆盖启动层的配置。 - 复制属性:确保配置文件设置为“始终复制”或“较新复制”。
9. WebApplication 对象配置(ASP.NET 6+)
中间件注册:从 ASP.NET 6 开始,中间件的注册由 IApplicationBuilder
转变为 WebApplication
类型。
示例:
app.UseEndpoints(builder =>
{builder.MapHealthChecks("/healthz"); // 配置健康检查终结点
});