46 lines
1.9 KiB
C#
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;
|
|
}
|
|
} |