ObjectPool 대상 풀 디자인 모델

2790 단어
Micosoft.Extension.ObjectPool
소스 코드 구조, 모델 분석:
3 대 기본 대상:
  • ObjectPool 추상 류
  • ObjectPoolProvider 추상 류
  • IPooledObjectPolicy 인터페이스
  • ObjectPool 의 기본 구현 은 DefaultPool 입 니 다. 대상 풀 의 생 성 은 Object PoolProvider 추상 류 의 기본 구현 DefaultObject PoolProvider 류 로 이 루어 집 니 다.
    public class DefaultObjectPoolProvider : ObjectPoolProvider
    {
        /// 
        /// The maximum number of objects to retain in the pool.
        /// 
        public int MaximumRetained { get; set; } = Environment.ProcessorCount * 2;
    
        /// 
        public override ObjectPool Create(IPooledObjectPolicy policy)
        {
            if (policy == null)
            {
                throw new ArgumentNullException(nameof(policy));
            }
    
            if (typeof(IDisposable).IsAssignableFrom(typeof(T)))
            {
                return new DisposableObjectPool(policy, MaximumRetained);
            }
    
            return new DefaultObjectPool(policy, MaximumRetained);
        }
    }

    IPooled ObjectPolicy 인 터 페 이 스 는 대응 하 는 추상 적 인 클래스 와 기본 적 인 구현 이 있 으 며, 대상 탱크 의 대상 (즉 탱크 대상) 의 생 성 또는 이 정책 클래스 로 되 돌아 가 제어 합 니 다.
    public override T Get()
    {
        var item = _firstItem;
        if (item == null || Interlocked.CompareExchange(ref _firstItem, null, item) != item)
        {
            var items = _items;
            for (var i = 0; i < items.Length; i++)
            {
                item = items[i].Element;
                if (item != null && Interlocked.CompareExchange(ref items[i].Element, null, item) == item)
                {
                    return item;
                }
            }
    
            item = Create();
        }
    
        return item;
    }
    
    // Non-inline to improve its code quality as uncommon path
    [MethodImpl(MethodImplOptions.NoInlining)]
    private T Create() => _fastPolicy?.Create() ?? _policy.Create();
    
    public override void Return(T obj)
    {
        if (_isDefaultPolicy || (_fastPolicy?.Return(obj) ?? _policy.Return(obj)))
        {
            if (_firstItem != null || Interlocked.CompareExchange(ref _firstItem, obj, null) != null)
            {
                var items = _items;
                for (var i = 0; i < items.Length && Interlocked.CompareExchange(ref items[i].Element, obj, null) != null; ++i)
                {
                }
            }
        }
    }

    = = 전체적인 디자인 사고방식 에서 볼 때 공급 자 Provider 는 구체 적 인 대상 탱크 를 제공 하 는데 들 어 오 는 매개 변수 도 전략 클래스 이 고 전략 클래스 는 제어 탱크 대상 을 구체 적 으로 처리한다.dotnet core 의 많은 소스 코드 개발 모델 은 다음 과 같 습 니 다. Policy 를 통 해 Provider 를 구축 하고 Provider 를 통 해 최종 클래스 를 만 듭 니 다.즉, 전략 류 만 을 통 해 사용자 정의 확장 을 실현 하 는 구조 로 참고 하고 사고 할 수 있다. =
    공식 실현:
    Object reuse with ObjectPool in ASP.NET Core
    예시 참조:
    . NET Core 에서 Object Pool 의 간단 한 사용
    . Net 코어 중의 ObjectPool
    . NET Core 3.0 의 깊이 있 는 소스 코드 이해 ObjectPool (2)

    좋은 웹페이지 즐겨찾기