v10.10.2024.0601 优化Json序列化,支持DateOnly/TimeOnly,支持带时区的时间序列化
石头 编写于 2024-06-01 08:10:50
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;
        }
    }
}