Mango.Nop.Libraries/Mango.Nop.Services/MgSessionService.cs

46 lines
1.9 KiB
C#

using System.Collections.Concurrent;
using AyCode.Utils.Extensions;
namespace Mango.Nop.Services;
public abstract class MgSessionService<TSessionItem> : IMgSessionService<TSessionItem> where TSessionItem : class, IMgSessionItem
{
protected ConcurrentDictionary<string, TSessionItem> 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;
}
}