using System; using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using MapsterMapper; using ZhonTai.Common.Auth; using ZhonTai.Tools.Cache; using ZhonTai.Common.Extensions; namespace ZhonTai.Plate.Admin.Service { public abstract class BaseService: IBaseService { protected readonly object ServiceProviderLock = new object(); protected IDictionary CachedServices = new Dictionary(); private ICache _cache; private ILoggerFactory _loggerFactory; private IMapper _mapper; private IUser _user; /// /// 缓存 /// public ICache Cache => LazyGetRequiredService(ref _cache); /// /// 日志工厂 /// public ILoggerFactory LoggerFactory => LazyGetRequiredService(ref _loggerFactory); /// /// 映射 /// public IMapper Mapper => LazyGetRequiredService(ref _mapper); public IServiceProvider ServiceProvider { get; set; } /// /// 用户信息 /// public IUser User => LazyGetRequiredService(ref _user); /// /// 日志 /// protected ILogger Logger => _lazyLogger.Value; private Lazy _lazyLogger => new Lazy(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true); protected TService LazyGetRequiredService(ref TService reference) { if (reference == null) { lock (ServiceProviderLock) { if (reference == null) { reference = ServiceProvider.GetRequiredService(); } } } return reference; } /// /// 获得懒加载服务 /// /// 服务接口 /// public virtual TService LazyGetRequiredService() { return (TService)LazyGetRequiredService(typeof(TService)); } /// /// 根据服务类型获得懒加载服务 /// /// 服务类型 /// public virtual object LazyGetRequiredService(Type serviceType) { return CachedServices.GetOrAdd(serviceType, () => ServiceProvider.GetRequiredService(serviceType)); } } }