예제 #1
0
        public IDbConnectionSession BeginSession(RequestContext context)
        {
            if (SessionStore.LocalSession != null)
            {
                throw new SmartSqlException("SmartSqlMapper could not invoke BeginSession(). A LocalSession is already existed.");
            }
            InitDataSource(context, DataSourceChoice.Read);
            var dataSource = DataSourceFilter.Elect(context);
            var dbSession  = SessionStore.CreateDbSession(dataSource);

            dbSession.Begin();
            return(dbSession);
        }
예제 #2
0
        public async Task <T> ExecuteWrapAsync <T>(Func <IDbConnectionSession, Task <T> > execute, RequestContext context, DataSourceChoice sourceChoice = DataSourceChoice.Write)
        {
            SetupRequestContext(context, sourceChoice);
            if (CacheManager.TryGet <T>(context, out T cachedResult))
            {
                return(cachedResult);
            }

            return(await WrapWithTransactionAsync <T>(context, async (dbSession) =>
            {
                if (dbSession == null)
                {
                    var dataSource = DataSourceFilter.Elect(context);
                    dbSession = SessionStore.GetOrAddDbSession(dataSource);
                }
                try
                {
                    var result = await execute(dbSession).ConfigureAwait(false);
                    CacheManager.RequestExecuted(dbSession, context);
                    CacheManager.TryAdd <T>(context, result);
                    return result;
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex.HelpLink, ex, ex.Message);
                    throw ex;
                }
                finally
                {
                    if (dbSession.LifeCycle == DbSessionLifeCycle.Transient)
                    {
                        SessionStore.Dispose();
                    }
                }
            }));
        }