.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 应用程序架构。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84099.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人才争夺战关键期,AI如何赋能招聘效率倍增、精准选拔

数智化转型浪潮席卷全球的今天&#xff0c;人才作为企业核心竞争力的地位日益凸显。而在传统招聘流程&#xff0c;尤其是面试环节正面临效率瓶颈、体验短板等多项挑战&#xff0c;典型如&#xff1a; 耗时冗长的筛选与安排&#xff1b;难以避免的主观评价偏差&#xff1b;海量…

介绍下分布式ID的技术实现及应用场景

什么是分布式ID 分布式ID是指在分布式系统中生成的特定范围内唯一的标识符&#xff0c;如订单号、商品ID、链路追踪TraceID。 随着业务发展&#xff0c;对分布式ID的要求越来越高&#xff0c;其中最基本的要求如下 全局唯一&#xff1a;在任何节点、任何时间生成的ID都必须是…

【leetcode-字母异位词分组】

排序法 public List<List<String>> groupAnagrams(String[] strs) {//最终值List<List<String>> result new ArrayList<>();//排序法HashMap<String,List<String>> map new HashMap<>(); //遍历strfor(String str : strs){/…

langchain从入门到精通(九)——ChatGPT/Playground手动模拟记忆功能

1. 摘要缓冲混合记忆 摘要缓冲混合记忆中&#xff0c;所需的模块有&#xff1a; chat_message_history&#xff1a;存储历史消息列表。moving_summary_buffer&#xff1a;移除消息的汇总字符串。summary_llm&#xff1a;生成摘要的 LLM&#xff0c;接收 summary&#xff08;当…

docker单点安装Hadoop

1、Docker中拉取jdk8镜像 拉取镜像 docker pull openjdk:8-jdk 查看jdk docker run -it openjdk:8-jdk bash which java 2、安装ubuntu源 拉取镜像 docker pull ubuntu:22.04 保存 docker save -o ubuntu-22.04.tar.gz ubuntu:22.04 移动到自己想要的目录 mv /roo…

uniapp项目之小兔鲜儿小程序商城(二) 首页的实现:自定义导航栏,轮拨图,前台分类,热门推荐,猜你喜欢,下拉刷新,骨架屏

文章目录 零.首页最终效果一.自定义导航栏1.新建pages/index/components/CustomNavbar.vue首页子组件2.在首页pages/index/index.vue中引入3.隐藏默认导航栏修改标题颜色4.适配不同机型使用到了uniapp的一个api:获取屏幕边界到安全区域的距离在子组件中使用 二.轮拨图1.新建 sr…

RustDesk自建远程服务器

目录 服务端 环境linux 安装 开放端口 客户端配置 下载客户端 安装后配置网络 参考&#xff1a;RustDesk自建远程服务器_rustdesk自建服务器-CSDN博客 服务端 环境 linux 安装 下载 wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.8-2/r…

【Axure高保真原型】图片伸缩展示列表

今天和大家分享图片伸缩展示列表的3个原型案例&#xff0c;模版都是用中继器制作的&#xff0c;所以使用也很方便&#xff0c;在中继器表格里导入对应的图片&#xff0c;即可自动生成交互效果&#xff0c;具体效果可以点击下方视频观看或打开下方预览地址查看哦 【原型效果】 …

keil新建工程文件结构和每个文件的作用解析(标准库版本)

通过网盘分享的文件:STM32工程模板 链接:https://pan.baidu.com/s/1YPFgXu1kwuwsCVxrXFSjZg?pwd=1111 提取码: 1111 --来自百度网盘超级会员v5的分享 这个工程模版是来源于B站江科大的模版,每个人搭建工程文件结构不一样,仅供参考。 工程文件目录结构如图所示 1、DebugC…

【AI论文】Saffron-1:LLM安全保证的推理缩放范例

摘要&#xff1a;现有的安全保证研究主要集中在培训阶段的协调&#xff0c;以向LLM灌输安全行为。 然而&#xff0c;最近的研究表明这些方法容易受到各种越狱攻击。 同时&#xff0c;推理扩展显著提高了LLM推理能力&#xff0c;但在安全保证方面仍未得到探索。 为了解决这一差距…

LLM 支持的基于意图的分类 网络钓鱼电子邮件

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 网络钓鱼攻击仍然是现代网络安全的重大威胁&#xff0c;因为它们成功地欺骗了人类和旨在保护他们的防御机制。传统的检测系统主要关注用户在收件箱中看不到的电子邮件元数据。此外&#xff0c;这些…

C++新特性技术发展路径和时间

C 的新特性发展路径和时间线是一个持续演进的过程。以下是一个概览&#xff0c;涵盖了主要的 C 标准及其关键特性&#xff0c;以及它们发布的时间&#xff1a; C 标准版本及发布时间线: C98 (ISO/IEC 14882:1998): 第一个正式的 C 标准。 发布时间: 1998年关键特性: 标准模板库…

OpenAI 如何在激烈的AI人才争夺战中抢占先机?

在这个快速发展的人工智能时代&#xff0c;OpenAI 正处于一个至关重要的发展阶段。随着技术的不断进步&#xff0c;人工智能行业的竞争日益激烈。如何在这场巨大的竞争中立于不败之地&#xff0c;成为了每一个AI公司的核心挑战。就在近日&#xff0c;OpenAI 的新招聘主管华金・…

【Java学习笔记】Java绘图基础

Java绘图基础 一、Java 坐标体系 1. 像素的概念 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的 例如&#xff0c;计算机显示器的分辨率是 800600&#xff0c;表示计算机屏幕上的每一行由 800 个点组成&#xff0c;共有 600 行&#xff0c;整个计算机屏幕共有 480…

资深Java工程师的面试题目(一)基础到高级概述

以下是几道面向资深Java工程师的面试题目&#xff0c;涵盖了从基础知识到高级概念及参考答案&#xff1a; 1. Java内存模型和垃圾回收 问题: 请解释一下Java的内存模型&#xff0c;并描述不同类型的内存区域。如何选择适合特定应用需求的垃圾收集器&#xff1f;请比较几种常…

Spring Retry:优雅地实现方法重试机制

前言 在实际的软件开发中&#xff0c;尤其是在涉及网络请求、数据库操作或外部服务调用的场景下&#xff0c;我们常常会遇到一些临时性故障&#xff08;Transient Failures&#xff09;&#xff0c;例如网络波动、数据库连接超时、第三方 API 暂时不可用等。面对这些问题&…

Mysql报错

1.权限问题 MySQL 认证协议不兼容问题解决方案 这个错误表明您的 MySQL 客户端与服务器要求的认证协议不兼容&#xff0c;通常发生在 MySQL 8.0 服务器与旧版客户端之间。 nested exception is org.apache.ibatis.exceptions.PersistenceException: Error querying database. …

小米汽车5月交付量超过28000台,与上月持平

6月1日&#xff0c;小米汽车公布5月交付数据&#xff0c;2025年5月&#xff0c;小米汽车交付量超过28000台&#xff0c;4月官方披露的交付数据也为28000台。 此外&#xff0c;小米汽车5月新增29家门店&#xff0c;全国82城已有298家门店&#xff1b;6月计划新增37家门店&#x…

严格一致性模型

SC 的第二点约束 :store 必须被 所有(包括自身)执行流 同时看到 ,但是不要求写操作“立即”对其他处理器可见&#xff1b;允许写操作延迟一会儿被其他核观察到。 而 严格一致性模型,包括1. store 必须被 所有(包括自身)执行流 同时看到2. 看到的时间 必须是 某个处理器完成写操…

结合 STM32CubeMX 使用 FreeRTOS 实时操作系统

前言 在STM32CubeMX软件出现以后&#xff0c;创建嵌入式项目变得简洁了许多&#xff0c;开发者无需重复编写MCU的外设初始化配置&#xff0c;只需在STM32CubeMX软件中动动鼠标配置完毕&#xff0c;就可以自动生成基于HAL/LL库的Keil项目文件&#xff0c;提高了开发效率。 最近想…