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