ASP.NET Core 2.0中如何设置和访问应用程序级变量?
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




