.NET开发中全局数据存储的常见方式

 更新时间:2025年06月17日 11:10:34   作者:百锦再@新空间  
在 .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 应用程序架构。

到此这篇关于.NET开发中全局数据存储的常见方式的文章就介绍到这了,更多相关.NET全局数据存储内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ASP.NET MVC遍历验证ModelState的错误信息

    ASP.NET MVC遍历验证ModelState的错误信息

    这篇文章介绍了ASP.NET MVC遍历ModelState错误信息的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • 详解.NET Core+Docker 开发微服务

    详解.NET Core+Docker 开发微服务

    这篇文章给大家分享了.NET Core+Docker 开发微服务的相关知识点内容,有兴趣的朋友们参考下。
    2018-09-09
  • ASP.NET Core配置教程之读取配置信息

    ASP.NET Core配置教程之读取配置信息

    这篇文章主要介绍了ASP.NET Core配置教程的第一篇读取配置信息,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • ASP.NET动态加载用户控件的实现方法

    ASP.NET动态加载用户控件的实现方法

    动态加载用户控件的方法,用asp.net的朋友推荐
    2008-10-10
  • asp.net注册Javascript的方法

    asp.net注册Javascript的方法

    今天在cnblogs上看到有关注册Javascript,主要是用到了ClientScript的三个方法。
    2008-07-07
  • asp.net实现根据城市获取天气预报的方法

    asp.net实现根据城市获取天气预报的方法

    这篇文章主要介绍了asp.net实现根据城市获取天气预报的方法,涉及asp.net调用新浪接口获取天气预报信息的实现技巧,非常简单实用,需要的朋友可以参考下
    2015-12-12
  • Asp.net Core中如何使用中间件来管理websocket

    Asp.net Core中如何使用中间件来管理websocket

    这篇文章主要给大家介绍了关于Asp.net Core中如何使用中间件来管理websocket的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • ASP.NET网站实时显示时间的方法

    ASP.NET网站实时显示时间的方法

    这篇文章主要介绍了ASP.NET网站实时显示时间的方法,主要通过AJAX控件来实现该功能,是非常具有实用价值的技巧,需要的朋友可以参考下
    2014-11-11
  • 在.net core中实现字段和属性注入的示例代码

    在.net core中实现字段和属性注入的示例代码

    这篇文章主要介绍了在.net core中实现字段和属性注入的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • ASP.NET实现文件上传

    ASP.NET实现文件上传

    这篇文章主要为大家详细介绍了ASP.NET实现文件上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07

最新评论