84 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Microsoft.Extensions.Logging;
 | |
| 
 | |
| using MongoDB.Driver;
 | |
| 
 | |
| namespace DataProviders {
 | |
| 
 | |
|   public interface ISessionService {
 | |
|     Task<Guid> StartSession();
 | |
|     IClientSessionHandle? GetSession(Guid id);
 | |
|     void StartTransaction(Guid id);
 | |
|     void CommitTransaction(Guid id);
 | |
|     void RollbackTransaction(Guid id);
 | |
|     void DisposeSession(Guid id);
 | |
|   }
 | |
|   public class SessionService : ISessionService {
 | |
| 
 | |
|     private readonly ILogger<SessionService> _logger;
 | |
|     private readonly IMongoClient _client;
 | |
|     private Dictionary<Guid, IClientSessionHandle?> _sessions;
 | |
| 
 | |
|     public SessionService(
 | |
|       ILogger<SessionService> logger,
 | |
|       IMongoClient client
 | |
|     ) {
 | |
|       _logger = logger;
 | |
|       _client = client;
 | |
|       _sessions = new Dictionary<Guid, IClientSessionHandle?>();
 | |
|     }
 | |
| 
 | |
|     public async Task<Guid> StartSession() {
 | |
|       var sessionId = Guid.NewGuid();
 | |
| 
 | |
|       var session = await _client.StartSessionAsync();
 | |
| 
 | |
|       _sessions.Add(sessionId, session);
 | |
| 
 | |
|       return sessionId;
 | |
|     }
 | |
| 
 | |
|     public IClientSessionHandle? GetSession(Guid id) {
 | |
|       _sessions.TryGetValue(id, out IClientSessionHandle? session);
 | |
|       return session;
 | |
|     }
 | |
| 
 | |
|     public void StartTransaction(Guid id) {
 | |
|       var session = GetSession(id);
 | |
| 
 | |
|       if (session != null)
 | |
|         session.StartTransaction();
 | |
|     }
 | |
| 
 | |
|     public void CommitTransaction(Guid id) {
 | |
|       var session = GetSession(id);
 | |
| 
 | |
|       if (session != null) {
 | |
|         session.CommitTransaction();
 | |
|         session.Dispose();
 | |
| 
 | |
|         _sessions.Remove(id);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     public async void RollbackTransaction(Guid id) {
 | |
|       var session = GetSession(id);
 | |
| 
 | |
|       if (session != null) {
 | |
|         await session.AbortTransactionAsync();
 | |
|         session.Dispose();
 | |
| 
 | |
|         _sessions.Remove(id);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     public void DisposeSession(Guid id) {
 | |
|       var session = GetSession(id);
 | |
| 
 | |
|       if (session != null) {
 | |
|         session.Dispose();
 | |
|         _sessions.Remove(id);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 |