You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET Core 2.0中如何设置和访问应用程序级变量?

替代.NET Core中传统Application["CompanyName"]的方案

嘿,这个问题我之前从.NET Framework迁移到.NET Core的时候也踩过坑!确实,.NET Core里已经抛弃了基于System.Web的Application全局对象,取而代之的是更符合依赖注入和模块化设计的方案,给你推荐几个最常用的:

1. 用配置系统存储(适合静态配置)

如果你的CompanyName是不常变动的配置项,直接把它放到appsettings.json里是最省心的:

首先在配置文件里添加:

{
  "AppSettings": {
    "CompanyName": "你的公司名称"
  }
}

然后有两种使用方式:

  • 直接注入IConfiguration读取:在控制器或视图里注入IConfiguration,然后用_configuration["AppSettings:CompanyName"]获取值。
  • 绑定强类型配置(更推荐,类型安全):
    先创建一个配置类:
    public class AppSettings
    {
        public string CompanyName { get; set; }
    }
    
    接着在Program.cs里注册配置绑定:
    builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings"));
    
    之后在需要的地方注入IOptions<AppSettings>,就能通过_appSettings.Value.CompanyName获取值了。

2. 内存缓存(适合从数据库读取且偶尔变动的场景)

如果CompanyName是存在数据库里、可能会更新,但又不想每次请求都查数据库,用IMemoryCache缓存是最佳选择:

首先确保已经注册了缓存服务(.NET Core默认模板已经包含,但如果没有的话,在Program.cs里加):

builder.Services.AddMemoryCache();

然后在需要的地方注入IMemoryCache,用GetOrCreateAsync来实现“读取一次缓存,过期自动刷新”:

var companyName = await _memoryCache.GetOrCreateAsync("CompanyName", async entry =>
{
    // 这里写从数据库读取CompanyName的逻辑
    var dbCompanyName = await _dbContext.Companies
        .Select(c => c.Name)
        .FirstOrDefaultAsync();
    
    // 设置缓存过期时间,比如1小时后自动重新读取数据库
    entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1);
    return dbCompanyName;
});

这样第一次请求会查数据库并缓存,之后直接读内存,过期后自动触发重新读取,完美平衡性能和数据新鲜度。

3. 单例服务(适合启动时加载、几乎不变的场景)

如果CompanyName从数据库读取后几乎不会变动,那可以创建一个单例服务,在应用启动时就加载这个值,全程复用:

先创建一个服务类:

public class CompanyInfoService
{
    public string CompanyName { get; }

    // 构造函数注入DbContext,启动时读取数据库
    public CompanyInfoService(YourDbContext dbContext)
    {
        CompanyName = dbContext.Companies
            .Select(c => c.Name)
            .FirstOrDefault() ?? "默认公司名";
    }
}

然后在Program.cs里注册为单例:

builder.Services.AddSingleton<CompanyInfoService>();

之后在控制器、视图或者其他服务里注入CompanyInfoService,直接用_companyInfoService.CompanyName就能获取值了——整个应用生命周期里只会查一次数据库,性能拉满。

为什么.NET Core不用Application对象?

简单说,传统Application是基于System.Web的静态全局对象,不符合.NET Core的依赖注入优先、模块化、可测试的设计理念。上面的方案都是基于DI的,更灵活,也更容易做单元测试。

内容的提问来源于stack exchange,提问作者Laurie Dickinson

火山引擎 最新活动