如何在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
相关产品推荐
相关产品推荐

