Implement SessionService, SessionItem; improvements, fixes, etc...

This commit is contained in:
Loretta 2024-12-04 19:13:56 +01:00
parent fd1b873108
commit 8c3a25e5c6
4 changed files with 68 additions and 0 deletions

View File

@ -0,0 +1,7 @@
namespace Mango.Nop.Services;
public interface IMgSessionItem
{
string SessionId { get; }
int RequestCount { get; set; }
}

View File

@ -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();
}

View File

@ -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; }
}

View File

@ -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;
}