欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > .NET 开发中全局数据存储的几种方式

.NET 开发中全局数据存储的几种方式

2025/6/22 2:25:08 来源:https://blog.csdn.net/sixpp/article/details/148710586  浏览:    关键词:.NET 开发中全局数据存储的几种方式

在这里插入图片描述

文章目录

    • 一、静态类与静态成员
      • 实现方式
      • 特点
      • 优缺点
    • 二、应用程序配置系统
      • 1. appsettings.json (ASP.NET Core)
      • 使用方式
      • 2. 用户设置 (WinForms/WPF)
      • 特点
    • 三、依赖注入容器
      • ASP.NET Core 示例
      • 特点
    • 四、内存缓存 (IMemoryCache)
      • 实现方式
      • 特点
    • 五、分布式缓存 (IDistributedCache)
      • 实现方式
      • 特点
    • 六、HttpContext.Items (ASP.NET Core)
      • 实现方式
      • 特点
    • 七、环境变量
      • 访问方式
      • 特点
    • 八、数据库存储
      • 实现方式
      • 特点
    • 九、选择指南
    • 十、最佳实践建议
    • 十一、高级模式示例
      • 混合缓存策略
      • 配置热重载

在这里插入图片描述

在 .NET 应用程序开发中,全局数据存储是共享和访问应用程序范围内数据的常见需求。以下是几种主要的全局数据存储方式及其适用场景、实现方法和优缺点分析。

一、静态类与静态成员

实现方式

public static class GlobalData
{public static string ApplicationName { get; set; } = "MyApp";public static int MaxConnections { get; } = 100;private static readonly ConcurrentDictionary<string, object> _cache = new ConcurrentDictionary<string, object>();public static void SetCache(string key, object value){_cache[key] = value;}public static T GetCache<T>(string key){return _cache.TryGetValue(key, out var value) ? (T)value : default;}
}

特点

  • 生命周期:应用程序域生命周期
  • 线程安全:需要手动实现(如使用 ConcurrentDictionary
  • 适用场景:小型应用、工具类、全局配置

优缺点

  • ✅ 简单易用
  • ✅ 访问速度快
  • ❌ 缺乏持久化
  • ❌ 测试困难(静态依赖)

二、应用程序配置系统

1. appsettings.json (ASP.NET Core)

{"AppConfig": {"Theme": "Dark","Timeout": 30}
}

使用方式

// 在Startup中配置
services.Configure<AppConfig>(Configuration.GetSection("AppConfig"));// 注入使用
public class MyService
{private readonly AppConfig _config;public MyService(IOptions<AppConfig> config){_config = config.Value;}
}

2. 用户设置 (WinForms/WPF)

// 保存设置
Properties.Settings.Default.Theme = "Dark";
Properties.Settings.Default.Save();// 读取设置
var theme = Properties.Settings.Default.Theme;

特点

  • 生命周期:持久化到配置文件
  • 线程安全:内置线程安全
  • 适用场景:应用程序配置、用户偏好设置

三、依赖注入容器

ASP.NET Core 示例

// 注册服务
services.AddSingleton<IGlobalCache, MemoryCache>();
services.AddScoped<IUserSession, UserSession>();// 使用
public class MyController : Controller
{private readonly IGlobalCache _cache;public MyController(IGlobalCache cache){_cache = cache;}
}

特点

  • 生命周期
    • Singleton: 应用程序生命周期
    • Scoped: 请求生命周期
    • Transient: 每次请求新实例
  • 线程安全:取决于实现
  • 适用场景:ASP.NET Core 应用、服务共享

四、内存缓存 (IMemoryCache)

实现方式

// 注册
services.AddMemoryCache();// 使用
public class DataService
{private readonly IMemoryCache _cache;public DataService(IMemoryCache cache){_cache = cache;}public string GetCachedData(string key){return _cache.GetOrCreate(key, entry => {entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30);return ExpensiveDatabaseCall();});}
}

特点

  • 生命周期:应用程序重启后丢失
  • 线程安全:内置线程安全
  • 适用场景:频繁访问的临时数据

五、分布式缓存 (IDistributedCache)

实现方式

// 使用Redis
services.AddStackExchangeRedisCache(options =>
{options.Configuration = "localhost:6379";
});// 使用
public async Task<byte[]> GetCachedDataAsync(string key)
{return await _distributedCache.GetAsync(key);
}

特点

  • 生命周期:持久化到外部存储
  • 线程安全:内置线程安全
  • 适用场景:分布式应用、多实例共享数据

六、HttpContext.Items (ASP.NET Core)

实现方式

// 中间件中设置
app.Use(async (context, next) =>
{context.Items["RequestStartTime"] = DateTime.UtcNow;await next();
});// 控制器中访问
var startTime = HttpContext.Items["RequestStartTime"] as DateTime?;

特点

  • 生命周期:单个HTTP请求期间
  • 线程安全:每个请求独立
  • 适用场景:请求级数据共享

七、环境变量

访问方式

var envVar = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

特点

  • 生命周期:进程生命周期或系统级
  • 线程安全:只读操作安全
  • 适用场景:部署配置、环境特定设置

八、数据库存储

实现方式

// 使用EF Core
public class AppDbContext : DbContext
{public DbSet<GlobalSetting> GlobalSettings { get; set; }
}// 使用
var setting = await _dbContext.GlobalSettings.FirstOrDefaultAsync(s => s.Key == "MaintenanceMode");

特点

  • 生命周期:持久化
  • 线程安全:取决于数据库访问层
  • 适用场景:需要持久化的全局配置

九、选择指南

存储方式生命周期持久化分布式支持典型使用场景
静态成员应用程序域全局常量、简单缓存
应用程序配置持久化部分应用设置、用户偏好
依赖注入容器取决于注册类型服务共享、全局服务
内存缓存应用程序频繁访问的临时数据
分布式缓存持久化多实例共享数据
HttpContext.Items请求期间请求级数据传递
环境变量进程/系统部署配置、环境特定设置
数据库存储持久化需要持久化的全局配置

十、最佳实践建议

  1. 按需选择:根据数据特性(大小、访问频率、生命周期)选择合适方式
  2. 分层设计
    • 高频小数据:内存缓存
    • 配置数据:appsettings.json
    • 用户数据:数据库
  3. 线程安全
    • 多线程访问时使用线程安全集合(如 ConcurrentDictionary
    • 考虑使用 Immutable 集合避免意外修改
  4. 性能考虑
    • 大数据集避免使用静态变量
    • 考虑使用缓存过期策略
  5. 测试友好
    • 避免过度使用静态类
    • 优先使用依赖注入
  6. 分布式场景
    • 多服务器环境使用分布式缓存
    • 考虑使用消息队列同步状态

十一、高级模式示例

混合缓存策略

public class HybridCache
{private readonly IMemoryCache _memoryCache;private readonly IDistributedCache _distributedCache;public HybridCache(IMemoryCache memoryCache, IDistributedCache distributedCache){_memoryCache = memoryCache;_distributedCache = distributedCache;}public async Task<T> GetOrCreateAsync<T>(string key, Func<Task<T>> factory, TimeSpan expiration){if (_memoryCache.TryGetValue(key, out T memoryValue)){return memoryValue;}var distributedValue = await _distributedCache.GetStringAsync(key);if (distributedValue != null){var value = JsonSerializer.Deserialize<T>(distributedValue);_memoryCache.Set(key, value, expiration);return value;}var newValue = await factory();_memoryCache.Set(key, newValue, expiration);await _distributedCache.SetStringAsync(key, JsonSerializer.Serialize(newValue), new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = expiration });return newValue;}
}

配置热重载

// Program.cs
builder.Services.Configure<AppConfig>(builder.Configuration.GetSection("AppConfig"));
builder.Services.AddSingleton<IOptionsMonitor<AppConfig>>(provider => provider.GetRequiredService<IOptionsMonitor<AppConfig>>());// 使用
public class ConfigService
{private readonly AppConfig _config;public ConfigService(IOptionsMonitor<AppConfig> configMonitor){_config = configMonitor.CurrentValue;configMonitor.OnChange(newConfig => {_config = newConfig;});}
}

通过合理选择和组合这些全局数据存储方式,可以构建出既高效又易于维护的 .NET 应用程序架构。

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词