You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:39:01