using System.Collections.Concurrent;

namespace ThingsGateway.NewLife.Model;

/// <summary>范围服务。该范围生命周期内，每个服务类型只有一个实例</summary>
/// <remarks>
/// 满足Singleton和Scoped的要求，暂时无法满足Transient的要求（仍然只有一份）。
/// </remarks>
public interface IServiceScope : IDisposable
{
    /// <summary>服务提供者</summary>
    IServiceProvider ServiceProvider { get; }
}

class MyServiceScope : IServiceScope, IServiceProvider
{
    public IServiceProvider? MyServiceProvider { get; set; }

    public IServiceProvider ServiceProvider => this;

    private readonly ConcurrentDictionary<Type, Object?> _cache = new();

    public void Dispose()
    {
        // 销毁所有缓存
        foreach (var item in _cache)
        {
            if (item.Value is IDisposable dsp) dsp.Dispose();
        }
    }

    public Object? GetService(Type serviceType)
    {
        while (true)
        {
            // 查缓存，如果没有再获取一个并缓存起来
            if (_cache.TryGetValue(serviceType, out var service)) return service;

            service = MyServiceProvider?.GetService(serviceType);

            if (_cache.TryAdd(serviceType, service)) return service;
        }
    }
}