.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
英文地址,請注明出處:http://en.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;提高了開發效率。 最近想…