解决 args 变量没有赋值导致的参数传递失败的问题。by Soar360
大石头 编写于 2023-09-09 07:16:48
X
using System.Collections.Concurrent;

namespace 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;
        }
    }
}