public UnitOfWork(IHttpContextAccessor httpContextAccessor, IServiceProvider servicesProvider) { _httpContextAccessor = httpContextAccessor; _servicesProvider = servicesProvider; if (_httpContextAccessor.HttpContext != null) { _contextManager = _servicesProvider.GetService <ContextManager>(); /* only with Ninject */ _context = _contextManager.Context; } /// USE SINGLETON (VALIDATE WITH ASYNC) else { int ThreadId = Thread.CurrentThread.ManagedThreadId; SynchronizationContext aaaa = SynchronizationContext.Current; /// VERIFY IF ALREADY EXISTS AN OPENED CONTEXT FOR THE CURRENT OPERATION if (UnitOfWorkContexManager.ContextOpen(ThreadId)) { _context = (FirstContext)UnitOfWorkContexManager.GetContext(ThreadId); isFirst = false; } /// IF NO, THEN CREATE NEW INSTANCE AND OPEN THE TRANSACTION else { _context = new FirstContext(); _context.Database.BeginTransaction(); UnitOfWorkContexManager.AddContext(_context, ThreadId); } } }
public void Dispose() { Dispose(true); GC.SuppressFinalize(this); if (_httpContextAccessor.HttpContext != null) { /// REMOVES AN ITEM FROM ARRAY var remove = _contextManager.RemoveContex; } else { if (isFirst) { UnitOfWorkContexManager.RemoveContext(Thread.CurrentThread.ManagedThreadId); } } }
public void Rollback() { if (_httpContextAccessor.HttpContext != null) { if (_contextManager.IsFirst) { if (_context.Database.CurrentTransaction != null) { _context.Database.RollbackTransaction(); rollback = true; } } } else { if (_context.Database.CurrentTransaction != null && isFirst) { _context.Database.CurrentTransaction.Rollback(); UnitOfWorkContexManager.RemoveContext(Thread.CurrentThread.ManagedThreadId); rollback = true; } } }
void Dispose(bool disposing) { if (!disposed) { if (disposing) { if (_httpContextAccessor.HttpContext != null) { if (_context.Database.CurrentTransaction != null && !rollback && _contextManager.IsFirst) { try { _context.Database.CurrentTransaction.Commit(); } catch { _context.Database.CurrentTransaction.Rollback(); throw; } finally { if (_contextManager.IsFirst) { _context.Dispose(); } } } } else { bool isDisposed = false; try { var id = _context.Database.CurrentTransaction.TransactionId; } catch { isDisposed = true; } if (!isDisposed && _context.Database.CurrentTransaction != null && !rollback && isFirst) { try { _context.Database.CurrentTransaction.Commit(); } catch { _context.Database.CurrentTransaction.Rollback(); throw; } finally { if (isFirst) { _context.Dispose(); UnitOfWorkContexManager.RemoveContext(Thread.CurrentThread.ManagedThreadId); } } } } } } disposed = true; }