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);
            }
        }