using System.Collections.Concurrent; using AyCode.Utils.Extensions; namespace Mango.Nop.Services; public abstract class MgSessionService : IMgSessionService where TSessionItem : class, IMgSessionItem { protected ConcurrentDictionary Sessions { get; } = new(); public bool TryGetSessionItem(string sessionId, out TSessionItem sessionItem) { return Sessions.TryGetValue(sessionId, out sessionItem!); } public TSessionItem? GetOrCreateSessionItem(string sessionId) { if (Sessions.TryGetValue(sessionId, out var sessionItem)) return sessionItem; if (sessionId.IsNullOrWhiteSpace()) throw new NullReferenceException("sessionId.IsNullOrWhiteSpace()"); sessionItem = Activator.CreateInstance(typeof(TSessionItem), sessionId) as TSessionItem; if (sessionItem == null) throw new NullReferenceException($"sessionItem == null); sessionId: {sessionId}"); return Sessions.TryAdd(sessionId, sessionItem) ? sessionItem : null; } public bool TryAddSessionItem(TSessionItem sessionItem) { if (sessionItem.SessionId.IsNullOrWhiteSpace() || Sessions.ContainsKey(sessionItem.SessionId)) throw new NullReferenceException($"(sessionItem.SessionKey.IsNullOrWhiteSpace() || Sessions.ContainsKey(sessionItem.SessionKey)); sessionId: {sessionItem?.SessionId};"); return Sessions.TryAdd(sessionItem.SessionId, sessionItem); } public bool TryRemoveSessionItem(string sessionId, out TSessionItem sessionItem) { return Sessions.TryRemove(sessionId, out sessionItem!); } public int Count() => Sessions.Count; public bool TryGetSessionItemBySignlaRConnectionId(string signalRConnectionId, out TSessionItem? sessionItem) { sessionItem = Sessions.Values.FirstOrDefault(x => x.SignaRConnectionId == signalRConnectionId); return sessionItem != null; } }