using System.Collections.Concurrent; using AyCode.Core.Extensions; using AyCode.Utils.Extensions; namespace AyCode.Database.DataLayers { public sealed class PooledDal { private static readonly PooledDal Instance = new(); private readonly ConcurrentDictionary> _dataLayersPoolById = new(); private static ConcurrentDictionary> DataLayersPoolById => Instance._dataLayersPoolById; public static int Count => DataLayersPoolById.Count; public static void Clear() => DataLayersPoolById.Clear(); public static TDal CreateDal() where TDal : IAcDalBase => Activator.CreateInstance(); /// /// /// /// /// ONLY SessionId or logged in PlayerId! /// public static TDal GetDalById(Guid id) where TDal : IAcDalBase { if (id.IsNullOrEmpty()) return CreateDal(); //TODO: A Guid.Empty id-t ÁTGONDOLNI! - J. if (DataLayersPoolById.TryGetValue(id, out var dataLayersByType)) return GetDalByType(dataLayersByType); dataLayersByType = new ConcurrentDictionary(); DataLayersPoolById.TryAdd(id, dataLayersByType); return GetDalByType(dataLayersByType); } private static TDal GetDalByType(ConcurrentDictionary dataLayersByType) where TDal : IAcDalBase { if (dataLayersByType.TryGetValue(typeof(TDal), out var dataLayer)) return (TDal)dataLayer; var resultDal = CreateDal(); dataLayersByType.TryAdd(typeof(TDal), resultDal); return resultDal; } /// /// /// /// SessionId or PlayerId /// public static bool Remove(Guid id)//, bool keepGuidEmptyId = true) { //if (keepGuidEmptyId && id == Guid.Empty) return false; if (!DataLayersPoolById.TryRemove(id, out var dataLayersByType)) return false; dataLayersByType.Clear(); return true; } } }