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

如何在DI中注册泛型ObjectPoolProvider及通用字典对象池策略?

解决方案

要实现无需逐个注册特定类型字典的对象池,同时保证每种类型的字典池都是单例,可以利用开放泛型注册让DI容器自动处理泛型参数匹配:

1. 注册开放泛型的策略与对象池

替换你原来的注册代码,使用以下方式注册开放泛型服务:

// 注册开放泛型的字典对象池策略,DI会自动为每种<TKey, TValue>组合创建单例策略实例
services.AddSingleton(typeof(PooledObjectPolicy<Dictionary<,>>), typeof(DictionaryPolicy<,>));

// 注册开放泛型的ObjectPool实现,DI会根据请求的泛型类型自动创建对应的单例对象池
services.AddSingleton(typeof(ObjectPool<>), typeof(DefaultObjectPool<>));

2. 使用对象池

在需要使用字典对象池的类中,直接注入对应泛型类型的ObjectPool<Dictionary<TKey, TValue>>即可,DI会自动提供单例的对象池实例:

public class SampleService
{
    private readonly ObjectPool<Dictionary<int, string>> _intStringDictPool;
    private readonly ObjectPool<Dictionary<string, DateTime>> _stringDateDictPool;

    public SampleService(
        ObjectPool<Dictionary<int, string>> intStringDictPool,
        ObjectPool<Dictionary<string, DateTime>> stringDateDictPool)
    {
        _intStringDictPool = intStringDictPool;
        _stringDateDictPool = stringDateDictPool;
    }

    public void ProcessData()
    {
        // 从池中获取字典
        var dict = _intStringDictPool.Get();
        try
        {
            // 业务逻辑:使用字典
            dict.Add(1, "example");
            Console.WriteLine(dict[1]);
        }
        finally
        {
            // 用完归还到池中(会自动清理字典内容)
            _intStringDictPool.Return(dict);
        }
    }
}

原理说明

  • 开放泛型PooledObjectPolicy<Dictionary<,>>会匹配任意Dictionary<TKey, TValue>对应的策略类型,DI容器会为每种<TKey, TValue>组合创建唯一的DictionaryPolicy<TKey, TValue>单例。
  • 开放泛型ObjectPool<>注册后,当你请求ObjectPool<Dictionary<TKey, TValue>>时,DI会自动结合对应的策略实例,创建DefaultObjectPool<Dictionary<TKey, TValue>>的单例对象池。

这样就无需手动逐个注册每种字典类型的对象池,同时保证了每种类型的池都是单例。

内容的提问来源于stack exchange,提问作者nim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:57:43