.NET Core 2.0中如何创建应用程序级共享变量?
.NET Core 2.0 全局共享数据解决方案
嘿,我懂你现在的困扰——.NET Core 2.0确实砍掉了传统ASP.NET里的Application变量,但咱们有好几种靠谱的替代方案来存储所有登录用户共享的非用户特定数据,下面给你详细拆解:
1. 依赖注入单例服务(最推荐)
这是.NET Core官方推崇的方式,单例服务在整个应用生命周期内只会创建一个实例,所有请求和用户都共享它,完美匹配你的需求。
操作步骤:
- 保留你写的
ApplicationLevelData类:
public class ApplicationLevelData { public Guid TestProperty { get; set; } public ApplicationLevelData() { TestProperty = Guid.NewGuid(); } }
- 在
Startup.cs的ConfigureServices方法里把它注册为单例:
public void ConfigureServices(IServiceCollection services) { // 其他服务注册代码... services.AddSingleton<ApplicationLevelData>(); }
- 在需要使用的地方(比如控制器、业务服务)通过构造函数注入:
public class HomeController : Controller { private readonly ApplicationLevelData _globalAppData; // 构造函数注入单例实例 public HomeController(ApplicationLevelData globalAppData) { _globalAppData = globalAppData; } public IActionResult Index() { // 直接使用全局共享数据 ViewBag.SharedGuid = _globalAppData.TestProperty; return View(); } }
重要提示:如果有多个线程同时修改这个数据,一定要加锁保证线程安全,比如给TestProperty的setter加锁:
private readonly object _lockObj = new object(); private Guid _testProperty; public Guid TestProperty { get => _testProperty; set { lock(_lockObj) { _testProperty = value; } } }
2. 使用IMemoryCache(适合带过期需求的场景)
如果你的共享数据需要临时存储、或者有自动过期失效的需求,用内存缓存会更灵活。
操作步骤:
- 确保在
Startup.cs里注册内存缓存(.NET Core 2.0默认已注册,显式写出更清晰):
services.AddMemoryCache();
- 在需要使用的地方注入
IMemoryCache,然后存取共享数据:
public class SharedDataService { private readonly IMemoryCache _cache; private const string SharedKey = "GlobalTestProperty"; public SharedDataService(IMemoryCache cache) { _cache = cache; } public Guid GetSharedTestProperty() { // 缓存中不存在则创建,还可自定义过期时间 return _cache.GetOrCreate(SharedKey, entry => { // 示例:设置1小时后自动过期 entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1); return Guid.NewGuid(); }); } }
3. 静态类(谨慎使用)
如果你不想用依赖注入,静态类也是一种选择,但要注意它的局限性——不好做单元测试,且必须自己处理线程安全问题。
示例代码:
public static class GlobalStaticData { private static Guid _testProperty = Guid.NewGuid(); private static readonly object _lock = new object(); public static Guid TestProperty { get => _testProperty; set { // 修改时加锁避免并发冲突 lock(_lock) { _testProperty = value; } } } }
使用时直接调用:var sharedGuid = GlobalStaticData.TestProperty;
额外提醒
如果你的网站是多实例部署(比如用负载均衡、容器集群),上面的内存内方案就不适用了——每个实例会有自己的数据副本。这时候你需要用分布式缓存(比如Redis)或者数据库来存储共享数据,确保所有实例都能访问到同一个数据源。
内容的提问来源于stack exchange,提问作者prog1011
相关产品推荐
相关产品推荐

