Kaynağa Gözat

😘1、实现SqlSugar二级缓存类型与全局保持一致(内存缓存、Redis) 2、优化全局查询过滤器

zuohuaijun 3 yıl önce
ebeveyn
işleme
0ff7d436f1

+ 4 - 4
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -17,9 +17,9 @@
     <PackageReference Include="AngleSharp" Version="1.0.0" />
     <PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
     <PackageReference Include="DotNetCore.Natasha.CSharp" Version="5.0.2" />
-    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.8.4.14" />
-    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.4.14" />
-    <PackageReference Include="Furion.Pure" Version="4.8.4.14" />
+    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.8.4.15" />
+    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.4.15" />
+    <PackageReference Include="Furion.Pure" Version="4.8.4.15" />
     <PackageReference Include="Lazy.Captcha.Core" Version="2.0.0" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.7.4.2" />
     <PackageReference Include="Magicodes.IE.Pdf" Version="2.7.4.2" />
@@ -30,7 +30,7 @@
     <PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.9" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.21.1" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="2.15.2" />
-    <PackageReference Include="SqlSugarCore" Version="5.1.3.45" />
+    <PackageReference Include="SqlSugarCore" Version="5.1.3.46-preview01" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.24" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />

+ 6 - 1
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -32,7 +32,7 @@
         </member>
         <member name="T:Admin.NET.Core.SqlSugarCache">
             <summary>
-            SqlSugar二级缓存(必须是内存缓存)
+            SqlSugar二级缓存
             </summary>
         </member>
         <member name="M:Admin.NET.Core.LazyCaptchaSetup.AddLazyCaptcha(Microsoft.Extensions.DependencyInjection.IServiceCollection)">
@@ -7206,6 +7206,11 @@
             </summary>
             <typeparam name="T"></typeparam>
         </member>
+        <member name="F:Admin.NET.Core.SqlSugarSetup._cache">
+            <summary>
+            缓存全局查询过滤器(内存缓存)
+            </summary>
+        </member>
         <member name="M:Admin.NET.Core.SqlSugarSetup.AddSqlSugar(Microsoft.Extensions.DependencyInjection.IServiceCollection)">
             <summary>
             Sqlsugar 上下文初始化

+ 11 - 16
Admin.NET/Admin.NET.Core/Cache/CacheSetup.cs

@@ -1,6 +1,4 @@
-using NewLife.Caching;
-
-namespace Admin.NET.Core;
+namespace Admin.NET.Core;
 
 public static class CacheSetup
 {
@@ -10,19 +8,16 @@ public static class CacheSetup
     /// <param name="services"></param>
     public static void AddCache(this IServiceCollection services)
     {
-        services.AddSingleton(options =>
+        ICache cache = Cache.Default;
+
+        var cacheOptions = App.GetOptions<CacheOptions>();
+        if (cacheOptions.CacheType == CacheTypeEnum.Redis.ToString())
         {
-            var cacheOptions = App.GetOptions<CacheOptions>();
-            if (cacheOptions.CacheType == CacheTypeEnum.Redis.ToString())
-            {
-                var redis = new FullRedis();
-                redis.Init(cacheOptions.RedisConnectionString);
-                return redis;
-            }
-            else
-            {
-                return Cache.Default;
-            }
-        });
+            var redis = new FullRedis();
+            redis.Init(cacheOptions.RedisConnectionString);
+            cache = redis;
+        }
+
+        services.AddSingleton(cache);
     }
 }

+ 4 - 6
Admin.NET/Admin.NET.Core/Cache/SqlSugarCache.cs

@@ -1,13 +1,11 @@
-using NewLife.Caching;
-
-namespace Admin.NET.Core;
+namespace Admin.NET.Core;
 
 /// <summary>
-/// SqlSugar二级缓存(必须是内存缓存)
+/// SqlSugar二级缓存
 /// </summary>
-public class SqlSugarCache : ICacheService, ISingleton
+public class SqlSugarCache : ICacheService
 {
-    private static readonly ICache _cache = Cache.Default;
+    private static readonly ICache _cache = App.GetService(typeof(ICache)) as ICache;
 
     public void Add<V>(string key, V value)
     {

+ 2 - 0
Admin.NET/Admin.NET.Core/GlobalUsings.cs

@@ -24,6 +24,7 @@ global using Microsoft.AspNetCore.Mvc.Filters;
 global using Microsoft.Extensions.Configuration;
 global using Microsoft.Extensions.DependencyInjection;
 global using Microsoft.Extensions.Options;
+global using NewLife.Caching;
 global using Newtonsoft.Json;
 global using SKIT.FlurlHttpClient;
 global using SKIT.FlurlHttpClient.Wechat.Api;
@@ -34,6 +35,7 @@ global using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models;
 global using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings;
 global using SqlSugar;
 global using System.Collections;
+global using System.Collections.Concurrent;
 global using System.ComponentModel;
 global using System.ComponentModel.DataAnnotations;
 global using System.Data;

+ 31 - 36
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -2,6 +2,11 @@ namespace Admin.NET.Core;
 
 public static class SqlSugarSetup
 {
+    /// <summary>
+    /// 缓存全局查询过滤器(内存缓存)
+    /// </summary>
+    private static readonly ICache _cache = Cache.Default;
+
     /// <summary>
     /// Sqlsugar 上下文初始化
     /// </summary>
@@ -278,17 +283,16 @@ public static class SqlSugarSetup
     /// </summary>
     private static void SetDeletedEntityFilter(SqlSugarScopeProvider db)
     {
-        // 配置实体假删除缓存
         var cacheKey = $"db:{db.CurrentConnectionConfig.ConfigId}:IsDelete";
-        var tableFilterItemList = db.DataCache.Get<List<TableFilterItem<object>>>(cacheKey);
-        if (tableFilterItemList == null)
+        var deletedFilter = _cache.Get<ConcurrentDictionary<Type, LambdaExpression>>(cacheKey);
+        if (deletedFilter == null)
         {
             // 获取基类实体数据表
             var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass
                 && (u.BaseType == typeof(EntityBase) || u.BaseType == typeof(EntityTenant) || u.BaseType == typeof(EntityBaseData)));
             if (!entityTypes.Any()) return;
 
-            var tableFilterItems = new List<TableFilterItem<object>>();
+            deletedFilter = new ConcurrentDictionary<Type, LambdaExpression>();
             foreach (var entityType in entityTypes)
             {
                 // 排除非当前数据库实体
@@ -299,18 +303,15 @@ public static class SqlSugarSetup
 
                 var lambda = DynamicExpressionParser.ParseLambda(new[] {
                     Expression.Parameter(entityType, "u") }, typeof(bool), $"{nameof(EntityBase.IsDelete)} == @0", false);
-                var tableFilterItem = new TableFilterItem<object>(entityType, lambda);
-                tableFilterItems.Add(tableFilterItem);
-                db.QueryFilter.Add(tableFilterItem);
+                db.QueryFilter.AddTableFilter(entityType, lambda);
+                deletedFilter.TryAdd(entityType, lambda);
             }
-            db.DataCache.Add(cacheKey, tableFilterItems);
+            _cache.Add(cacheKey, deletedFilter);
         }
         else
         {
-            tableFilterItemList.ForEach(u =>
-            {
-                db.QueryFilter.Add(u);
-            });
+            foreach (var filter in deletedFilter)
+                db.QueryFilter.AddTableFilter(filter.Key, filter.Value);
         }
     }
 
@@ -324,15 +325,15 @@ public static class SqlSugarSetup
 
         // 配置租户缓存
         var cacheKey = $"db:{db.CurrentConnectionConfig.ConfigId}:TenantId:{tenantId}";
-        var tableFilterItemList = db.DataCache.Get<List<TableFilterItem<object>>>(cacheKey);
-        if (tableFilterItemList == null)
+        var tenantFilter = _cache.Get<ConcurrentDictionary<Type, LambdaExpression>>(cacheKey);
+        if (tenantFilter == null)
         {
             // 获取租户实体数据表
             var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass
                 && (u.BaseType == typeof(EntityTenant) || u.BaseType == typeof(EntityTenantId)));
             if (!entityTypes.Any()) return;
 
-            var tableFilterItems = new List<TableFilterItem<object>>();
+            tenantFilter = new ConcurrentDictionary<Type, LambdaExpression>();
             foreach (var entityType in entityTypes)
             {
                 // 获取库隔离租户业务实体
@@ -348,18 +349,15 @@ public static class SqlSugarSetup
 
                 var lambda = DynamicExpressionParser.ParseLambda(new[] {
                     Expression.Parameter(entityType, "u") }, typeof(bool), $"{nameof(EntityTenant.TenantId)} == @0", long.Parse(tenantId));
-                var tableFilterItem = new TableFilterItem<object>(entityType, lambda);
-                tableFilterItems.Add(tableFilterItem);
-                db.QueryFilter.Add(tableFilterItem);
+                db.QueryFilter.AddTableFilter(entityType, lambda);
+                tenantFilter.TryAdd(entityType, lambda);
             }
-            db.DataCache.Add(cacheKey, tableFilterItems);
+            _cache.Add(cacheKey, tenantFilter);
         }
         else
         {
-            tableFilterItemList.ForEach(u =>
-            {
-                db.QueryFilter.Add(u);
-            });
+            foreach (var filter in tenantFilter)
+                db.QueryFilter.AddTableFilter(filter.Key, filter.Value);
         }
     }
 
@@ -373,8 +371,8 @@ public static class SqlSugarSetup
 
         // 配置用户机构范围缓存
         var cacheKey = $"db:{db.CurrentConnectionConfig.ConfigId}:UserId:{userId}";
-        var tableFilterItemList = db.DataCache.Get<List<TableFilterItem<object>>>(cacheKey);
-        if (tableFilterItemList == null)
+        var orgFilter = _cache.Get<ConcurrentDictionary<Type, LambdaExpression>>(cacheKey);
+        if (orgFilter == null)
         {
             // 获取用户所属机构
             var orgIds = App.GetService<SysCacheService>().Get<List<long>>(CacheConst.KeyOrgIdList + userId);
@@ -385,7 +383,7 @@ public static class SqlSugarSetup
                 && u.BaseType == typeof(EntityBaseData));
             if (!entityTypes.Any()) return;
 
-            var tableFilterItems = new List<TableFilterItem<object>>();
+            orgFilter = new ConcurrentDictionary<Type, LambdaExpression>();
             foreach (var entityType in entityTypes)
             {
                 // 排除非当前数据库实体
@@ -396,18 +394,15 @@ public static class SqlSugarSetup
 
                 var lambda = DynamicExpressionParser.ParseLambda(new[] {
                     Expression.Parameter(entityType, "u") }, typeof(bool), $"@0.Contains(u.{nameof(EntityBaseData.CreateOrgId)}??{default(long)})", orgIds);
-                var tableFilterItem = new TableFilterItem<object>(entityType, lambda);
-                tableFilterItems.Add(tableFilterItem);
-                db.QueryFilter.Add(tableFilterItem);
+                db.QueryFilter.AddTableFilter(entityType, lambda);
+                orgFilter.TryAdd(entityType, lambda);
             }
-            db.DataCache.Add(cacheKey, tableFilterItems);
+            _cache.Add(cacheKey, orgFilter);
         }
         else
         {
-            tableFilterItemList.ForEach(u =>
-            {
-                db.QueryFilter.Add(u);
-            });
+            foreach (var filter in orgFilter)
+                db.QueryFilter.AddTableFilter(filter.Key, filter.Value);
         }
     }
 
@@ -418,7 +413,7 @@ public static class SqlSugarSetup
     {
         // 配置用户机构范围缓存
         var cacheKey = $"db:{db.CurrentConnectionConfig.ConfigId}:Custom";
-        var tableFilterItemList = db.DataCache.Get<List<TableFilterItem<object>>>(cacheKey);
+        var tableFilterItemList = _cache.Get<List<TableFilterItem<object>>>(cacheKey);
         if (tableFilterItemList == null)
         {
             // 获取自定义实体过滤器
@@ -448,7 +443,7 @@ public static class SqlSugarSetup
                     db.QueryFilter.Add(tableFilterItem);
                 }
             }
-            db.DataCache.Add(cacheKey, tableFilterItems);
+            _cache.Add(cacheKey, tableFilterItems);
         }
         else
         {