public async Task <object> AroundInvoke(IInvocationContext invocationContext)
        {
            // May consider TransactionScope because EF one really sucks at nesting
            // But TransactionScope is not good for async before .NET 4.5.1.
            // May consider for future version
            var dbContext = _dbContext.Value;

            if (dbContext.Database.CurrentTransaction != null)
            {
                var result = await invocationContext.Proceed();

                await _completingEvents.FireAsync(new TransactionCompleting());

                dbContext.SaveChanges();
                return(result);
            }

            using (var transaction = dbContext.Database.BeginTransaction())
            {
                try
                {
                    var result = await invocationContext.Proceed();

                    await _completingEvents.FireAsync(new TransactionCompleting());

                    dbContext.SaveChanges();
                    transaction.Commit();
                    await _successfulEvents.FireAsync(new TransactionComitted());

                    return(result);
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }