From 19118442566a223b7a3d49f1b3d5534e56c4dc6e Mon Sep 17 00:00:00 2001 From: zpc Date: Mon, 5 Aug 2024 14:42:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HuanMeng.MiaoYu.Code/Base/MiaoYuBase.cs | 5 +- .../Cache/Contract/CacheBase.cs | 63 +++++++++++++ .../HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs | 88 +++++++++++++------ .../Cache/MiaoYuDataEntityCache.cs | 6 +- .../Cache/Special/CharacterEntityCache.cs | 25 ++++-- .../HuanMeng.MiaoYu.Code/Other/OtherBLL.cs | 12 ++- 6 files changed, 158 insertions(+), 41 deletions(-) create mode 100644 src/0-core/HuanMeng.MiaoYu.Code/Cache/Contract/CacheBase.cs diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Base/MiaoYuBase.cs b/src/0-core/HuanMeng.MiaoYu.Code/Base/MiaoYuBase.cs index e28f5c6..9933ff5 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Base/MiaoYuBase.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Base/MiaoYuBase.cs @@ -6,6 +6,7 @@ using HuanMeng.DotNetCore.JwtInfrastructure.Interface; using HuanMeng.DotNetCore.MultiTenant; using HuanMeng.DotNetCore.MultiTenant.Contract; using HuanMeng.MiaoYu.Code.Cache; +using HuanMeng.MiaoYu.Code.Cache.Contract; using HuanMeng.MiaoYu.Code.DataAccess; using HuanMeng.MiaoYu.Code.TencentUtile; @@ -31,7 +32,7 @@ namespace HuanMeng.MiaoYu.Code.Base /// /// BLL父类 /// - public class MiaoYuBase : BLLBase + public class MiaoYuBase : CacheBase//BLLBase { public MiaoYuBase(IServiceProvider serviceProvider) : base(serviceProvider) @@ -259,7 +260,7 @@ namespace HuanMeng.MiaoYu.Code.Base if (_miaoYuCache == null) { //new MiaoYuDataEntityCache(Dao).DataList - _miaoYuCache = new MiaoYuCache(Dao, Mapper); + _miaoYuCache = new MiaoYuCache(this); } return _miaoYuCache; } diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Cache/Contract/CacheBase.cs b/src/0-core/HuanMeng.MiaoYu.Code/Cache/Contract/CacheBase.cs new file mode 100644 index 0000000..22bb9d0 --- /dev/null +++ b/src/0-core/HuanMeng.MiaoYu.Code/Cache/Contract/CacheBase.cs @@ -0,0 +1,63 @@ +using AutoMapper; + +using HuanMeng.DotNetCore.Base; + +using Microsoft.Extensions.DependencyInjection; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HuanMeng.MiaoYu.Code.Cache.Contract +{ + /// + /// + /// + public class CacheBase : BLLBase + { + public CacheBase(IServiceProvider serviceProvider) : base(serviceProvider) + { + } + + #region 数据库 + private DAO _dao; + /// + /// dao 数据库 + /// + public override DAO Dao + { + get + { + if (_dao == null) + { + _dao = new DAO(_serviceProvider); + } + return _dao; + } + } + #endregion + + #region 映射 + private IMapper _mapper; + + /// + /// dto映射 + /// + //[FromServices] + public virtual IMapper Mapper + { + get + { + if (_mapper == null) + { + _mapper = _serviceProvider.GetRequiredService(); + } + return _mapper; + } + set { _mapper = value; } + } + #endregion + } +} diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs b/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs index ca08d7c..ffead2d 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs @@ -15,7 +15,7 @@ namespace HuanMeng.MiaoYu.Code.Cache /// 缓存类 /// /// - public partial class MiaoYuCache(DAO dao, IMapper mapper) + public partial class MiaoYuCache(CacheBase cacheBase) { #region 角色缓存表 @@ -33,7 +33,7 @@ namespace HuanMeng.MiaoYu.Code.Cache if (Character == null) { //Character = new MiaoYuDataEntityCache(dao, MiaoYuCacheExtend.CharacterLock); - Character = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(dao); + Character = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(cacheBase); } return Character.DataList ?? new List(); } @@ -57,8 +57,7 @@ namespace HuanMeng.MiaoYu.Code.Cache { if (ModelConfig == null) { - //ModelConfig = new MiaoYuDataEntityCache(dao, MiaoYuCacheExtend.ModelConfigLock); - ModelConfig = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(dao); + ModelConfig = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(cacheBase); } return ModelConfig.DataList ?? new List(); } @@ -70,7 +69,7 @@ namespace HuanMeng.MiaoYu.Code.Cache /// /// 角色缓存表 /// - public CharacterEntityCache? CharacterCache { get; set; } + public CommonDataEntityCache? CharacterCache { get; set; } /// /// 角色 /// @@ -80,8 +79,8 @@ namespace HuanMeng.MiaoYu.Code.Cache { if (CharacterCache == null) { - - CharacterCache = new CharacterEntityCache(dao, mapper); + CharacterCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(cacheBase); + //CharacterCache = new CharacterEntityCache(cacheBase); } return CharacterCache.DataList ?? new List(); } @@ -105,7 +104,7 @@ namespace HuanMeng.MiaoYu.Code.Cache if (ImageConfigCache == null) { //ImageConfigCache = new MiaoYuDataEntityCache(dao, MiaoYuCacheExtend.ImageConfigLock); - ImageConfigCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(dao); + ImageConfigCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(cacheBase); } return ImageConfigCache.DataList ?? new List(); } @@ -131,7 +130,7 @@ namespace HuanMeng.MiaoYu.Code.Cache if (CharacterTypeCache == null) { //CharacterTypeCache = new MiaoYuDataEntityCache(dao, MiaoYuCacheExtend.CharacterTypeLock); - CharacterTypeCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(dao); + CharacterTypeCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(cacheBase); } return CharacterTypeCache.DataList ?? new List(); } @@ -156,7 +155,7 @@ namespace HuanMeng.MiaoYu.Code.Cache if (CharacterTypeIntimacyCache == null) { //CharacterTypeIntimacyCache = new MiaoYuDataEntityCache(dao, MiaoYuCacheExtend.CharacterTypeIntimacyLock); - CharacterTypeIntimacyCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(dao); + CharacterTypeIntimacyCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(cacheBase); } return CharacterTypeIntimacyCache.DataList ?? new List(); } @@ -205,7 +204,13 @@ namespace HuanMeng.MiaoYu.Code.Cache { typeof(T_Image_Config), ImageConfigLock }, { typeof(T_Character_Type), CharacterTypeLock }, { typeof(T_Character_Type_Intimacy), CharacterTypeIntimacyLock }, - + }; + /// + /// 特殊的缓存锁对象 + /// + public static Dictionary SpecialCacheLockList { get; set; } = new Dictionary + { + { typeof(CharacterCache), CharacterLock }, }; #endregion @@ -214,29 +219,35 @@ namespace HuanMeng.MiaoYu.Code.Cache /// 获取对应的缓存 /// /// - /// + /// /// - public static CommonDataEntityCache GetMiaoYuDataEntityCache(DAO dao) where T : class + public static CommonDataEntityCache GetMiaoYuDataEntityCache(CacheBase cacheBase) where T : class { object cacheLock; - if (!CacheLockList.TryGetValue(typeof(T), out cacheLock)) + var typeo = typeof(T); + if (SpecialCacheLockList.TryGetValue(typeo, out cacheLock)) { - Console.WriteLine("没有找到锁对象==>" + typeof(T).Name); + var o = new CharacterEntityCache(cacheBase, cacheLock) as CommonDataEntityCache; + return o; + } + if (!CacheLockList.TryGetValue(typeo, out cacheLock)) + { + Console.WriteLine("没有找到锁对象==>" + typeo.Name); // 创建一个新的锁对象,并添加到 CacheLockList 中 cacheLock = new object(); - CacheLockList[typeof(T)] = cacheLock; + CacheLockList[typeo] = cacheLock; } - return new MiaoYuDataEntityCache(dao, cacheLock); + return new MiaoYuDataEntityCache(cacheBase, cacheLock); } /// /// 获取缓存数据 /// /// - /// + /// /// - public static List GetMiaoYuDataEntityCacheList(DAO dao) where T : class + public static List GetMiaoYuDataEntityCacheList(CacheBase cacheBase) where T : class { - var cache = GetMiaoYuDataEntityCache(dao); + var cache = GetMiaoYuDataEntityCache(cacheBase); return cache?.DataList ?? new List(); } @@ -244,21 +255,44 @@ namespace HuanMeng.MiaoYu.Code.Cache /// 清除全部缓存 /// /// - public static void ClareMiaoYuDataEntityCache(DAO dao) + public static void ClareMiaoYuDataEntityCache(CacheBase cacheBase) { foreach (var item in CacheLockList) { var t = item.Key; Type cacheType = typeof(MiaoYuDataEntityCache<>).MakeGenericType(t); - var shujuduixiang = Activator.CreateInstance(cacheType, dao, item.Value,36000); + var shujuduixiang = Activator.CreateInstance(cacheType, cacheBase, item.Value, 36000); var x = shujuduixiang as ICacheClearData; if (x != null) { x.ClearData(); } - //new MiaoYuDataEntityCache(dao, cacheLock); - //Activator.CreateInstance(t); } + var obj = SpecialCacheLockList[typeof(CharacterEntityCache)]; + CharacterEntityCache characterEntityCache = new CharacterEntityCache(cacheBase, obj); + characterEntityCache.ClearData(); + } + + /// + /// 刷新部缓存 + /// + /// + public static void ReloadMiaoYuDataEntityCache(CacheBase cacheBase) + { + foreach (var item in CacheLockList) + { + var t = item.Key; + Type cacheType = typeof(MiaoYuDataEntityCache<>).MakeGenericType(t); + var shujuduixiang = Activator.CreateInstance(cacheType, cacheBase, item.Value, 36000); + var x = shujuduixiang as ICacheReloadData; + if (x != null) + { + x.ReloadData(); + } + } + var obj = SpecialCacheLockList[typeof(CharacterEntityCache)]; + CharacterEntityCache characterEntityCache = new CharacterEntityCache(cacheBase, obj); + characterEntityCache.ReloadData(); } #endregion @@ -288,13 +322,13 @@ namespace HuanMeng.MiaoYu.Code.Cache /// /// /// - public static string GetImageUrl(this int imageId, DAO dao) + public static string GetImageUrl(this int imageId, CacheBase cacheBase) { - if (imageId == 0 || dao == null) + if (imageId == 0 || cacheBase == null) { return ""; } - MiaoYuCache miaoYuCache = new MiaoYuCache(dao, null); + MiaoYuCache miaoYuCache = new MiaoYuCache(cacheBase); return GetImageUrl(imageId, miaoYuCache); } diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuDataEntityCache.cs b/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuDataEntityCache.cs index 695cdf7..faf8e4c 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuDataEntityCache.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuDataEntityCache.cs @@ -1,5 +1,6 @@ +using HuanMeng.MiaoYu.Code.Cache.Contract; using HuanMeng.MiaoYu.Code.DataAccess; using Microsoft.EntityFrameworkCore; @@ -9,9 +10,10 @@ namespace HuanMeng.MiaoYu.Code.Cache /// /// 妙语数据库实体类缓存 /// - public class MiaoYuDataEntityCache(DAO _dao, object lockObj, int cacheTime = 36000) + public class MiaoYuDataEntityCache(CacheBase cacheBase, object lockObj, int cacheTime = 36000) : CommonDataEntityCache(lockObj, cacheTime) where T : class { + public DataAccess.DAO _dao = cacheBase.Dao; /// /// 缓存的key /// @@ -28,7 +30,7 @@ namespace HuanMeng.MiaoYu.Code.Cache /// public override List GetDataList() { - + var dbSet = _dao.daoDbMiaoYu.context.Set().AsNoTracking(); if (dbSet == null) { diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Cache/Special/CharacterEntityCache.cs b/src/0-core/HuanMeng.MiaoYu.Code/Cache/Special/CharacterEntityCache.cs index b987781..422bce0 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Cache/Special/CharacterEntityCache.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Cache/Special/CharacterEntityCache.cs @@ -1,4 +1,6 @@ using AutoMapper; + +using HuanMeng.MiaoYu.Code.Cache.Contract; using HuanMeng.MiaoYu.Model.Dto; using HuanMeng.MiaoYu.Model.Dto.Character; using HuanMeng.MiaoYu.Model.Dto.Label; @@ -12,12 +14,13 @@ namespace HuanMeng.MiaoYu.Code.Cache.Special /// /// /// - public class CharacterEntityCache(DAO _dao, IMapper mapper) : MiaoYuDataEntityCache(_dao, CharacterCacheLock) + public class CharacterEntityCache(CacheBase cacheBase, object CharacterCacheLock) : MiaoYuDataEntityCache(cacheBase, CharacterCacheLock) { /// /// 锁 /// private static object CharacterCacheLock = new object(); + private IMapper mapper = cacheBase.Mapper; /// /// 获取缓存数据 @@ -27,7 +30,7 @@ namespace HuanMeng.MiaoYu.Code.Cache.Special { List characterCaches = new List(); //读取角色表 - var characters = _dao.daoDbMiaoYu.context.T_Character.Where(it=>it.Visibility).ToList(); + var characters = _dao.daoDbMiaoYu.context.T_Character.Where(it => it.Visibility).ToList(); if (characters == null) { return characterCaches; @@ -39,24 +42,28 @@ namespace HuanMeng.MiaoYu.Code.Cache.Special //查询配置表 var modelConfigs = _dao.daoDbMiaoYu.context.T_Model_Config.ToList(); //图片 - var images = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(_dao); + var images = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(cacheBase); //标签 - var labels = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(_dao); + var labels = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(cacheBase); //标签关联表 - var labelRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(_dao); + var labelRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(cacheBase); //性格 - var personalitys = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(_dao); + var personalitys = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(cacheBase); //性格关联表 - var personalityRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(_dao); + var personalityRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(cacheBase); //分类 - var types = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(_dao); ; + var types = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(cacheBase); ; //分类关联表 - var typesRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(_dao); ; + var typesRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(cacheBase); ; foreach (var characterCache in characterCaches) { var modelConfig = modelConfigs.FirstOrDefault(it => it.Id == characterCache.ModelConfigId); + if (modelConfig==null) + { + modelConfig= modelConfigs.FirstOrDefault(); + } if (modelConfig != null) { characterCache.ModelConfig = modelConfig; diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Other/OtherBLL.cs b/src/0-core/HuanMeng.MiaoYu.Code/Other/OtherBLL.cs index cbb8b7c..5bfd112 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Other/OtherBLL.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Other/OtherBLL.cs @@ -20,7 +20,17 @@ namespace HuanMeng.MiaoYu.Code.Other /// public Task CleraCache() { - MiaoYuCacheExtend.ClareMiaoYuDataEntityCache(Dao); + MiaoYuCacheExtend.ClareMiaoYuDataEntityCache(this); + return Task.CompletedTask; + } + + /// + /// 刷新缓存 + /// + /// + public Task ReloadCache() + { + MiaoYuCacheExtend.ReloadMiaoYuDataEntityCache(this); return Task.CompletedTask; } }