maksit-mongodb-linq/src/MaksIT.MongoDB.Linq/MongoSessionManager.cs
Maksym Sadovnychyy b3edd3398d (feature): init
2024-08-25 04:05:09 +02:00

57 lines
2.1 KiB
C#

using MongoDB.Driver;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
namespace MaksIT.MongoDB.Linq {
public interface IMongoSessionManager {
Task<DisposableMongoSession> GetOrCreateSessionAsync();
void ReleaseSession(DisposableMongoSession session);
}
public class MongoSessionManager : IMongoSessionManager {
private readonly IMongoClient _client;
private readonly ILogger<MongoSessionManager> _logger;
private readonly ConcurrentDictionary<string, DisposableMongoSession> _sessions;
public MongoSessionManager(ILogger<MongoSessionManager> logger, IMongoClient client) {
_logger = logger;
_client = client;
_sessions = new ConcurrentDictionary<string, DisposableMongoSession>();
}
public async Task<DisposableMongoSession> GetOrCreateSessionAsync() {
// Generate a unique session ID
var sessionId = Guid.NewGuid().ToString();
if (_sessions.TryGetValue(sessionId, out var existingSession)) {
_logger.LogInformation("Reusing existing session with ID: {SessionId}", sessionId);
return existingSession;
}
_logger.LogInformation("Creating a new session with ID: {SessionId}", sessionId);
var sessionHandle = await _client.StartSessionAsync();
var newSession = new DisposableMongoSession(sessionHandle, sessionId);
if (_sessions.TryAdd(sessionId, newSession)) {
return newSession;
}
_logger.LogError("Failed to add session with ID: {SessionId}", sessionId);
newSession.Dispose();
throw new InvalidOperationException("Failed to create or retrieve session.");
}
public void ReleaseSession(DisposableMongoSession session) {
if (_sessions.TryRemove(session.SessionId, out var _)) {
_logger.LogInformation("Releasing and disposing session with ID: {SessionId}", session.SessionId);
session.Dispose();
}
else {
_logger.LogWarning("Failed to find session with ID: {SessionId} for release.", session.SessionId);
}
}
}
}