public IResponseStatus <TResponse> Execute <TResponse>(IRequest <TResponse> request) where TResponse : IResponse, new() { var unitOfWork = IoC.Resolve <IUnitOfWork>(); var stopwatch = new Stopwatch(); IResponseStatus <TResponse> responseStatus; try { stopwatch.Start(); var command = CommandFactory.Create(request); if (command.RequiresTransaction) { unitOfWork.BeginTransaction(); } LimitDbContext(request, _dbContext); try { responseStatus = TryExecute(request, command); if (responseStatus is OkResponseStatus <TResponse> ) { unitOfWork.SaveChanges(); if (command.RequiresTransaction) { unitOfWork.CompleteTransaction(); } AfterExecute(request, ((OkResponseStatus <TResponse>)responseStatus).Response, command); } } catch // (Exception e) { if (command.RequiresTransaction) { unitOfWork.RollbackTransaction(); } //ErrorLogUtils.AddError(e); var error = new InternalServerResponseError(); responseStatus = new ErrorResponseStatus <TResponse>(error); } unitOfWork.Dispose(); return(responseStatus); } catch (Exception e) { //ErrorLogUtils.AddError(e); var error = new InternalServerResponseError(e.Message); responseStatus = new ErrorResponseStatus <TResponse>(error); return(responseStatus); } finally { if (unitOfWork != null && unitOfWork.IsDisposed == false) { unitOfWork.Dispose(); } stopwatch.Stop(); //SaveApiLogEntry(stopwatch.ElapsedMilliseconds, response ?? errResponse, request, authenticateResult.Partner); } }