Implement SessionService, SessionItem; improvements, fixes, etc...
This commit is contained in:
parent
fd1b873108
commit
8c3a25e5c6
|
|
@ -0,0 +1,7 @@
|
||||||
|
namespace Mango.Nop.Services;
|
||||||
|
|
||||||
|
public interface IMgSessionItem
|
||||||
|
{
|
||||||
|
string SessionId { get; }
|
||||||
|
int RequestCount { get; set; }
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
|
||||||
|
namespace Mango.Nop.Services;
|
||||||
|
|
||||||
|
public interface IMgSessionService<TSessionItem> where TSessionItem : IMgSessionItem
|
||||||
|
{
|
||||||
|
//public ConcurrentDictionary<string, TSessionItem> Sessions { get; }
|
||||||
|
|
||||||
|
public TSessionItem? GetOrCreateSessionItem(string sessionId);
|
||||||
|
public bool TryAddSessionItem(TSessionItem sessionItem);
|
||||||
|
public bool TryGetSessionItem(string sessionId, out TSessionItem sessionItem);
|
||||||
|
public bool TryRemoveSessionItem(string sessionId, out TSessionItem sessionItem);
|
||||||
|
public int Count();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
namespace Mango.Nop.Services;
|
||||||
|
|
||||||
|
public abstract class MgSessionItem(string sessionKey) : IMgSessionItem
|
||||||
|
{
|
||||||
|
public string SessionId { get; protected set; } = sessionKey;
|
||||||
|
public int RequestCount { get; set; }
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
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;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue