AddMemoryCacheSetup 实现思想笔记
2026/7/29 23:29:55 网站建设 项目流程

### 一、核心设计思想
AddMemoryCacheSetup 采用了 接口隔离 + 依赖注入 + 策略模式 的组合设计,实现了缓存功能的解耦和可扩展性

注册1: ICaching → MemoryCaching (Scoped)

注册2: IMemoryCache (Singleton)

### 三、设计原则解析 1. 接口隔离原则(ISP)
问题 :.NET 内置的 IMemoryCache 接口功能强大但复杂,业务代码只需简单的 Get/Set 操作。

解决方案 :定义简化的 ICaching 接口,只暴露业务需要的方法。

// 简化的业务接口 public interface ICaching { object Get(string cacheKey); void Set(string cacheKey, object cacheValue, int timeSpan); }

2. 依赖注入(DI)
问题 : MemoryCaching 需要底层的 IMemoryCache 来存储数据。

解决方案 :通过构造函数注入 IMemoryCache ,由 DI 容器自动解析依赖。

public class MemoryCaching : ICaching { private readonly IMemoryCache _cache; public MemoryCaching(IMemoryCache cache) // 构造函数注入 { _cache = cache; } }

3. 生命周期管理
为什么需要两种生命周期?

ICaching → MemoryCaching Scoped 操作类,无状态,每个请求独立

IMemoryCache Singleton 数据容器,需要全局共享缓存数据

- MemoryCaching 是"工具",每个请求可以有自己的工具
- IMemoryCache 是"仓库",所有请求共享同一个仓库
- 如果两者都是 Scoped,缓存数据会被隔离,失去意义
- 如果两者都是 Singleton,可能存在线程安全问题

// 内存缓存 services.AddScoped<ICaching, MemoryCaching>(); // 切换到 Redis(只需改一行) services.AddScoped<ICaching, RedisCaching>();
public static void AddMemoryCacheSetup(this IServiceCollection services) { services.AddScoped<ICaching, MemoryCaching>(); // 业务接口注册 services.AddSingleton<IMemoryCache>(factory => // 底层缓存注册 { var cache = new MemoryCache(new MemoryCacheOptions()); return cache; }); }
public class MemoryCaching : ICaching { private readonly IMemoryCache _cache; public MemoryCaching(IMemoryCache cache) { _cache = cache; } public object Get(string cacheKey) { return _cache.Get(cacheKey); } public void Set(string cacheKey, object cacheValue, int timeSpan) { _cache.Set(cacheKey, cacheValue, TimeSpan.FromSeconds(timeSpan * 60)); } }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询