From 8c3a25e5c69ed989cfd1ab1c4bebd13b08680881 Mon Sep 17 00:00:00 2001 From: Loretta Date: Wed, 4 Dec 2024 19:13:56 +0100 Subject: [PATCH] Implement SessionService, SessionItem; improvements, fixes, etc... --- Mango.Nop.Services/IMgSessionItem.cs | 7 +++++ Mango.Nop.Services/IMgSessionService.cs | 14 +++++++++ Mango.Nop.Services/MgSessionItem.cs | 7 +++++ Mango.Nop.Services/MgSessionService.cs | 40 +++++++++++++++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 Mango.Nop.Services/IMgSessionItem.cs create mode 100644 Mango.Nop.Services/IMgSessionService.cs create mode 100644 Mango.Nop.Services/MgSessionItem.cs create mode 100644 Mango.Nop.Services/MgSessionService.cs diff --git a/Mango.Nop.Services/IMgSessionItem.cs b/Mango.Nop.Services/IMgSessionItem.cs new file mode 100644 index 0000000..2a4b363 --- /dev/null +++ b/Mango.Nop.Services/IMgSessionItem.cs @@ -0,0 +1,7 @@ +namespace Mango.Nop.Services; + +public interface IMgSessionItem +{ + string SessionId { get; } + int RequestCount { get; set; } +} \ No newline at end of file diff --git a/Mango.Nop.Services/IMgSessionService.cs b/Mango.Nop.Services/IMgSessionService.cs new file mode 100644 index 0000000..ef72c05 --- /dev/null +++ b/Mango.Nop.Services/IMgSessionService.cs @@ -0,0 +1,14 @@ +using System.Collections.Concurrent; + +namespace Mango.Nop.Services; + +public interface IMgSessionService where TSessionItem : IMgSessionItem +{ + //public ConcurrentDictionary 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(); +} \ No newline at end of file diff --git a/Mango.Nop.Services/MgSessionItem.cs b/Mango.Nop.Services/MgSessionItem.cs new file mode 100644 index 0000000..ee6356a --- /dev/null +++ b/Mango.Nop.Services/MgSessionItem.cs @@ -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; } +} \ No newline at end of file diff --git a/Mango.Nop.Services/MgSessionService.cs b/Mango.Nop.Services/MgSessionService.cs new file mode 100644 index 0000000..acedf10 --- /dev/null +++ b/Mango.Nop.Services/MgSessionService.cs @@ -0,0 +1,40 @@ +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; +} \ No newline at end of file