ASP.NET Core 6.0 Razor Pages如何设置全局变量?
在ASP.NET Core中实现启动时初始化全局静态类的方案
在ASP.NET Core里,你可以通过Program.cs启动流程中的初始化逻辑替代原来.NET Framework中Global.asax的Application_Start方法,实现从数据库读取配置并赋值给自定义静态类的需求,具体有两种常用方式:
方式一:同步初始化(适用于同步数据库操作)
在Program.cs中,Web应用构建完成后、启动之前执行初始化代码,这是最直接对应原Application_Start时机的方案:
var builder = WebApplication.CreateBuilder(args); // 1. 注册你的DbContext及其他服务 builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); // 其他服务注册(比如MVC、Swagger等)... var app = builder.Build(); // 2. 创建服务作用域,获取DbContext并初始化静态类 using (var scope = app.Services.CreateScope()) { var serviceProvider = scope.ServiceProvider; var dbContext = serviceProvider.GetRequiredService<AppDbContext>(); // 可选:确保数据库已创建(根据你的实际需求决定是否保留) dbContext.Database.EnsureCreated(); // 从数据库读取全局配置 var globalSettings = dbContext.GlobalSettings.SingleOrDefault(); if (globalSettings != null) { MyConfig.ServiceName = globalSettings.ServiceName; MyConfig.ContactEmail = globalSettings.ContactEmail; } } // 3. 配置中间件(比如路由、授权等)... app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
方式二:异步初始化(适用于异步数据库操作)
如果你的数据库查询是异步方法(推荐使用EF Core的异步API),可以将Program.cs改为异步启动:
var builder = WebApplication.CreateBuilder(args); // 注册服务... builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); var app = builder.Build(); // 异步初始化逻辑 using (var scope = app.Services.CreateScope()) { var serviceProvider = scope.ServiceProvider; var dbContext = serviceProvider.GetRequiredService<AppDbContext>(); await dbContext.Database.EnsureCreatedAsync(); var globalSettings = await dbContext.GlobalSettings.SingleOrDefaultAsync(); if (globalSettings != null) { MyConfig.ServiceName = globalSettings.ServiceName; MyConfig.ContactEmail = globalSettings.ContactEmail; } } // 配置中间件... app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); await app.RunAsync();
注意事项
- 静态类
MyConfig如果只在启动时赋值、后续只读,无需额外线程安全处理;如果后续有更新操作,需要添加锁机制保证线程安全。 - 必须通过
CreateScope()创建服务作用域来获取DbContext,因为DbContext是作用域服务,不能直接从根服务容器获取。
内容的提问来源于stack exchange,提问作者hiks
相关产品推荐
相关产品推荐

