internal static void Test_Scenario(StructuredQuery structuredQuery, Action invalidationCallback, bool expectInvalidation) { CachingQuerySqlBuilder cachingQuerySqlBuilder; Mock <IQuerySqlBuilder> mockQuerySqlBuilder; IQuerySqlBuilder querySqlBuilder; QuerySettings settings; QueryBuild queryBuild; IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( ); settings = new QuerySettings( ); queryBuild = new QueryBuild( ); var cacheInvalidators = new CacheInvalidatorFactory( ).CacheInvalidatorsList_TestOnly; mockQuerySqlBuilder = new Mock <IQuerySqlBuilder>(MockBehavior.Strict); mockQuerySqlBuilder.Setup(x => x.BuildSql(It.IsAny <StructuredQuery>( ), settings)) .Returns <StructuredQuery, QuerySettings>((sq, qs) => { QuerySqlBuilder.IdentifyCacheDependencies(sq, settings); return(queryBuild); }) .Verifiable( ); querySqlBuilder = mockQuerySqlBuilder.Object; cachingQuerySqlBuilder = new CachingQuerySqlBuilder(querySqlBuilder, userRuleSetProvider); try { // Add current cache invalidator to global factory cacheInvalidators.Add(cachingQuerySqlBuilder.CacheInvalidator); using (var scope = Factory.Current.BeginLifetimeScope(cb => { cb.Register(c => cachingQuerySqlBuilder).As <ICacheService>( ); })) using (Factory.SetCurrentScope(scope)) { // Run first time cachingQuerySqlBuilder.BuildSql(structuredQuery.DeepCopy( ), settings); // Perform potential invalidation task using (new SecurityBypassContext( )) { invalidationCallback( ); } // Run second time cachingQuerySqlBuilder.BuildSql(structuredQuery.DeepCopy( ), settings); } int times = expectInvalidation ? 2 : 1; mockQuerySqlBuilder.Verify(x => x.BuildSql(It.IsAny <StructuredQuery>( ), settings), Times.Exactly(times)); mockQuerySqlBuilder.VerifyAll( ); } finally { // Restore cache invalidators cacheInvalidators.Remove(cachingQuerySqlBuilder.CacheInvalidator); } }
/// <summary> /// Actually build the SQL /// </summary> private QueryBuild BuildQueryImpl(StructuredQuery query, QuerySettings settings) { // Unless otherwise specified, use the cache provider for creating inner security queries as well. if (settings.SecurityQueryRunner == null) { settings.SecurityQueryRunner = this; } return(QuerySqlBuilder.BuildSql(query, settings)); }
public override DataTable QueryDbConfigExist(IDictionary <string, string> dicQuery) { //查询并返回结果 var querySqlBuilder = new QuerySqlBuilder(DataAccess); querySqlBuilder.Sql( @"SELECT 1 FROM WH_BD_DB_CONFIG A WHERE 1=1 AND A.DB_CONFIG_CODE = @DB_CONFIG_CODE "); querySqlBuilder.Sql("DB_CONFIG_ID", "AND A.DB_CONFIG_ID <> @DB_CONFIG_ID"); querySqlBuilder.Sql("DB_CONFIG_CODE", ""); //此处必须添加 return(querySqlBuilder.Query(dicQuery)); }