You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:40:37