C# 可全局共享的IDictionary接口实现自定义字典类方案咨询
可行实现方案
方案1:单例模式(无依赖注入场景首选)
直接给EntityDictionary类实现单例模式,单例的实例本身是非静态对象,完全保留接口实现能力,也支持正常的序列化/反序列化操作,代码示例如下:
public class EntityDictionary : IDictionary<byte[], IDispenseEntity> { // 饿汉模式初始化单例,天然线程安全 private static readonly EntityDictionary _instance = new EntityDictionary(); public static EntityDictionary Instance => _instance; // 构造函数设为私有,禁止外部手动创建新实例 private EntityDictionary() { _backing = new Dictionary<byte[], IDispenseEntity>(new ByteArrayComparer()); } private Dictionary<byte[], IDispenseEntity> _backing; // 原有接口实现、自定义属性和方法保持不变 public IDispenseEntity this[byte[] key] { get => _backing[key]; set => _backing[key] = value; } public ICollection<byte[]> Keys => _backing.Keys; public ICollection<IDispenseEntity> Values => _backing.Values; // 新增自定义方法用于替换内部字典,反序列化加载数据时使用 public void ReplaceBacking(EntityDictionary newData) { _backing = newData._backing; } // ... 其余接口实现、自定义业务方法 }
- 全局访问方式:所有业务类直接调用
EntityDictionary.Instance即可访问同一份实例 - 序列化/反序列化示例:
// 序列化保存到本地文件 var serializeConfig = new JsonSerializerOptions { // 配置接口多态序列化规则,避免IDispenseEntity序列化失败 TypeInfoResolver = EntityDictionarySerializerContext.Default }; var json = JsonSerializer.Serialize(EntityDictionary.Instance, serializeConfig); File.WriteAllText("entity_cache.json", json); // 从文件反序列化加载数据 var loadedData = JsonSerializer.Deserialize<EntityDictionary>(File.ReadAllText("entity_cache.json"), serializeConfig); if (loadedData != null) { EntityDictionary.Instance.ReplaceBacking(loadedData); }
注意:byte[]作为字典键时默认序列化会有兼容问题,可以自定义Json转换器将byte[]键转为Base64字符串存储即可解决。
方案2:依赖注入单例(有DI框架场景首选)
如果项目使用了ASP.NET Core、WPF等自带依赖注入框架的技术栈,直接将EntityDictionary注册为单例生命周期即可:
// 服务注册阶段代码 services.AddSingleton<EntityDictionary>(); // 也可同时注册接口实现,方便业务类依赖接口注入,进一步解耦 services.AddSingleton<IDictionary<byte[], IDispenseEntity>>(sp => sp.GetRequiredService<EntityDictionary>());
- 全局访问方式:所有需要用到数据集的类在构造函数中注入
EntityDictionary或者IDictionary<byte[], IDispenseEntity>,拿到的都是同一个实例 - 优势:完全解耦,方便单元测试,不需要修改原有
EntityDictionary类的结构
方案3:静态容器存储(不想修改原类代码场景可选)
如果不想改动原有EntityDictionary的代码结构,可以单独定义静态容器存储全局实例:
public static class GlobalBusinessData { public static EntityDictionary SharedEntityDict { get; set; } = new EntityDictionary(); }
所有业务类直接访问GlobalBusinessData.SharedEntityDict即可拿到同一个实例,同样支持序列化、接口调用的所有需求。
内容的提问来源于stack exchange,提问作者Eric Snyder
相关产品推荐
相关产品推荐

