• 系列教程
  • 开发文档
.NET Core基于abp vnext 开发个人网站【专题】
.NET Core基于abp vnext 开发个人网站【专题】
vs code 编辑器基础使用专题
vs code 编辑器基础使用专题
.NET/.NET Core面试题
.NET/.NET Core面试题
MySQL常见面试题
MySQL常见面试题
C# linq如何使用,无法识别方法等问题专场
C# linq如何使用,无法识别方法等问题专场
网站SEO优化专题,让搜索引擎对网站更有亲和力
网站SEO优化专题,让搜索引擎对网站更有亲和力
abp+vue-element-admin搭建个人网站
abp+vue-element-admin搭建个人网站
  • .NET(C#)多屏(双屏)设置屏幕显示器分辨率方法代码(SetRes)

    本文主要介绍.NET(C#)中通过Process调用SetRes.exe命令修改屏幕显示器分辨率方法代码。

  • MySQL JSON_TYPE() 函数

    MySQLJSON_TYPE()函数返回一个给定的JSON值的类型。JSON_TYPE()语法这里是MySQLJSON_TYPE()的语法:JSON_TYPE(json_value)参数json_value必需的。一个JSON值。返回值JSON_TYPE()函数返回一个utf8mb4字符串,它代表了

  • MySQL AND 运算符的用法

    当使用SELECT查询数据时,如果WHERE子句中有多个条件,可以根据需要使用AND,OR,或者NOT运算符将他们组合起来。本文主要介绍AND运算符。AND运算规则AND运算符是一个双目逻辑运算符,用来组合两个操作数。只有当两个操作数都为真时,结果才返回真,否则返回假或者NULL。AND运算符语法:

  • MySQL IS_IPV4() 函数

    MySQLIS_IPV4()函数检查给定的参数是否是一个合法的IPv4地址。IS_IPV4()语法这里是MySQLIS_IPV4()函数的语法:IS_IPV4(ip)参数ip必需的。一个待检查的IPv4地址。返回值MySQLIS_IPV4()函数检查给定的参数是否是一个合法的IPv4地址,如果是返回

  • 分享三个简单的抽奖算法实现

    完整代码案例中使用了一个简单的工厂模式///summary ///抽奖抽象类 ////summary pub

  • uni-app创建并运行微信小程序项目

    今天分享一下我在uni-app创建并运行微信小程序项目时遇到的问题和解决办法,分两步给大家说明,第一步是没有任何报错下的流程,第二部是遇到的问题和解决办法;一、正常情况(无报错)下的流程:1、打开HBuilderX,点击文件,选择新建一个项目创建成功后选中项目2、点击HBuilderX菜单栏工具下面的设置,然后在运行配置里面设置微信开发者工具的安装路径3、在微信开发者工具中,点击设置下面的安全设置,然后开启服务端口4、最后在HBuilderX运行配置中填写web服务调

  • .NET Core(C#)使用ExcelReport(NPOI)生成CSV报表

    ExcelReport是一个Excel模板渲染引擎。它基于关注点分离的理念,将数据与表格样式、字体格式分离。其中模板承载的表格样式、字体格式在可视化的情况下编辑。开发人员只需要绑定数据与目标标签的对应关系。ExcelReport就可以以数据驱动的方式渲染出目标报表。本文主要介绍.NETCore(C#)中,使用ExcelReport(NPOI)通过CSV模板生成CSV报表,生成CSV文件中的数据表格,以及相关示例代码。

  • ABP 源码解析 六. 缓存

    介绍此系列文章主要是对ABP源码进行解读,初探作者在创造ABP的框架思路,和使用到的设计模式进行。通过解读ABP源码,可以提升ABP使用方式,可以提升编码意识,提高面向对象编程思想。本篇文章主要介绍ABP框架的缓存实现机制。UMLUMLICache:定义一个可以存储并通过键获取项目的缓存CacheBase:基类缓存,简单实现ICacheAbpMemoryCache:使用MemoryCache实现ICacheICacheManager:缓存管理器应该,单例对象,跟踪和管理缓存对象CacheManagerBase:缓存管理器的基类AbpMemoryCacheManager:使用MemoryCache实现ICacheManagerICacheConfigurator:缓存配置器CacheConfigurator:实现ICacheConfiguratorICachingConfiguration:缓存系统配置CachingConfiguration:实现ICachingConfiguration源码解析ICacheICache主要是定义一个缓存项目接口,并且提供超时时间、获取值、设置缓存等内容。ABP系统默认系统了四个项目:应用程式设置缓存、租户设置缓存、用户设置缓存、多语言脚本缓存///<summary>///Definesacachethatcanbestoreandgetitemsbykeys.///定义一个可以存储并通过键获取项目的缓存///</summary>publicinterfaceICache:IDisposable{///<summary>///Uniquenameofthecache.///缓存唯一的名称///</summary>stringName{get;}///<summary>///Defaultslidingexpiretimeofcacheitems.///Defaultvalue:60minutes(1hour).///Canbechangedbyconfiguration.///默认缓存过期时间///默认值是1小时///可以通过配置改变///</summary>TimeSpanDefaultSlidingExpireTime{get;set;}///<summary>///Defaultabsoluteexpiretimeofcacheitems.///Defaultvalue:null(notused).///默认的缓存项的绝对过期时间///默认值:null(没有使用)///</summary>TimeSpan?DefaultAbsoluteExpireTime{get;set;}///<summary>///Getsanitemfromthecache.///Thismethodhidescacheproviderfailures(andlogsthem),///usesthefactorymethodtogettheobjectifcacheproviderfails.///从缓存中获取一个项目///这个方法隐藏了缓存提供者失败信息(并记录它们),如果缓存提供者失败,则使用工厂方法来获取对象///</summary>///<paramname="key">Key</param>///<paramname="factory">Factorymethodtocreatecacheitemifnotexists///如果不存在的话,创建缓存项的工厂方法///</param>///<returns>Cacheditem</returns>objectGet(stringkey,Func<string,object>factory);///<summary>///Getsanitemfromthecache.///Thismethodhidescacheproviderfailures(andlogsthem),///usesthefactorymethodtogettheobjectifcacheproviderfails.///</summary>///<paramname="key">Key</param>///<paramname="factory">Factorymethodtocreatecacheitemifnotexists</param>///<returns>Cacheditem</returns>Task<object>GetAsync(stringkey,Func<string,Task<object>>factory);///<summary>///Getsanitemfromthecacheornullifnotfound.///从缓存中获取一个项目,如果没有找到,则可以获得null///</summary>///<paramname="key">Key</param>///<returns>Cacheditemornullifnotfound</returns>objectGetOrDefault(stringkey);///<summary>///Getsanitemfromthecacheornullifnotfound.///</summary>///<paramname="key">Key</param>///<returns>Cacheditemornullifnotfound</returns>Task<object>GetOrDefaultAsync(stringkey);///<summary>///Saves/Overridesaniteminthecachebyakey.///Useoneoftheexpiretimesatmost(<paramrefname="slidingExpireTime"/>or<paramrefname="absoluteExpireTime"/>).///Ifnoneofthemisspecified,then///<seecref="DefaultAbsoluteExpireTime"/>willbeusedifit'snotnull.Othewise,<seecref="DefaultSlidingExpireTime"/>///willbeused.///在缓存中通过一个键来覆盖一个条目///</summary>///<paramname="key">Key</param>///<paramname="value">Value</param>///<paramname="slidingExpireTime">Slidingexpiretime</param>///<paramname="absoluteExpireTime">Absoluteexpiretime</param>voidSet(stringkey,objectvalue,TimeSpan?slidingExpireTime=null,TimeSpan?absoluteExpireTime=null);///<summary>///Saves/Overridesaniteminthecachebyakey.///Useoneoftheexpiretimesatmost(<paramrefname="slidingExpireTime"/>or<paramrefname="absoluteExpireTime"/>).///Ifnoneofthemisspecified,then///<seecref="DefaultAbsoluteExpireTime"/>willbeusedifit'snotnull.Othewise,<seecref="DefaultSlidingExpireTime"/>///willbeused.///</summary>///<paramname="key">Key</param>///<paramname="value">Value</param>///<paramname="slidingExpireTime">Slidingexpiretime</param>///<paramname="absoluteExpireTime">Absoluteexpiretime</param>TaskSetAsync(stringkey,objectvalue,TimeSpan?slidingExpireTime=null,TimeSpan?absoluteExpireTime=null);///<summary>///Removesacacheitembyit'skey.///通过它的键删除缓存项///</summary>///<paramname="key">Key</param>voidRemove(stringkey);///<summary>///Removesacacheitembyit'skey(doesnothingifgivenkeydoesnotexistsinthecache).///</summary>///<paramname="key">Key</param>TaskRemoveAsync(stringkey);///<summary>///Clearsallitemsinthiscache.///清除缓存中的所有项///</summary>voidClear();///<summary>///Clearsallitemsinthiscache.///</summary>TaskClearAsync();}CacheBase缓存项目基类只要实现了基本的存取操作,但是具体的实现,下沉到子类实现///<summary>///Base>///It'susedtosimplifyimplementing<seecref="ICache"/>.///基类缓存///简单实现<seecref="ICache"/>///</summary>publicabstract>CacheBase:ICache{publicILoggerLogger{get;set;}publicstringName{get;}publicTimeSpanDefaultSlidingExpireTime{get;set;}publicTimeSpan?DefaultAbsoluteExpireTime{get;set;}protectedreadonlyobjectSyncObj=newobject();privatereadonlyAsyncLock_asyncLock=newAsyncLock();///<summary>///Constructor.///</summary>///<paramname="name"></param>protectedCacheBase(stringname){Name=name;DefaultSlidingExpireTime=TimeSpan.FromHours(1);Logger=NullLogger.Instance;}publicvirtualobjectGet(stringkey,Func<string,object>factory){objectitem=null;try{item=GetOrDefault(key);}catch(Exceptionex){Logger.Error(ex.ToString(),ex);}if(item==null){lock(SyncObj){try{item=GetOrDefault(key);}catch(Exceptionex){Logger.Error(ex.ToString(),ex);}if(item==null){item=factory(key);if(item==null){returnnull;}try{Set(key,item);}catch(Exceptionex){Logger.Error(ex.ToString(),ex);}}}}returnitem;}publicvirtualasyncTask<object>GetAsync(stringkey,Func<string,Task<object>>factory){objectitem=null;try{item=awaitGetOrDefaultAsync(key);}catch(Exceptionex){Logger.Error(ex.ToString(),ex);}if(item==null){using(await_asyncLock.LockAsync()){try{item=awaitGetOrDefaultAsync(key);}catch(Exceptionex){Logger.Error(ex.ToString(),ex);}if(item==null){item=awaitfactory(key);if(item==null){returnnull;}try{awaitSetAsync(key,item);}catch(Exceptionex){Logger.Error(ex.ToString(),ex);}}}}returnitem;}publicabstractobjectGetOrDefault(stringkey);publicvirtualTask<object>GetOrDefaultAsync(stringkey){returnTask.FromResult(GetOrDefault(key));}publicabstractvoidSet(stringkey,objectvalue,TimeSpan?slidingExpireTime=null,TimeSpan?absoluteExpireTime=null);publicvirtualTaskSetAsync(stringkey,objectvalue,TimeSpan?slidingExpireTime=null,TimeSpan?absoluteExpireTime=null){Set(key,value,slidingExpireTime);returnTask.FromResult(0);}publicabstractvoidRemove(stringkey);publicvirtualTaskRemoveAsync(stringkey){Remove(key);returnTask.FromResult(0);}publicabstractvoidClear();publicvirtualTaskClearAsync(){Clear();returnTask.FromResult(0);}publicvirtualvoidDispose(){}}AbpMemoryCacheAbpMemoryCache是基于MemoryCache实现ICache,使用具体的缓存技术实现缓存项目///<summary>///Implements<seecref="ICache"/>toworkwith<seecref="MemoryCache"/>.///使用<seecref="MemoryCache"/>实现<seecref="ICache"/>///</summary>public>AbpMemoryCache:CacheBase{privateMemoryCache_memoryCache;///<summary>///Constructor.///</summary>///<paramname="name">Uniquenameofthecache</param>publicAbpMemoryCache(stringname):base(name){_memoryCache=newMemoryCache(newOptionsWrapper<MemoryCacheOptions>(newMemoryCacheOptions()));}publicoverrideobjectGetOrDefault(stringkey){return_memoryCache.Get(key);}publicoverridevoidSet(stringkey,objectvalue,TimeSpan?slidingExpireTime=null,TimeSpan?absoluteExpireTime=null){if(value==null){thrownewAbpException("Cannotinsertnullvaluestothecache!");}if(absoluteExpireTime!=null){_memoryCache.Set(key,value,DateTimeOffset.Now.Add(absoluteExpireTime.Value));}elseif(slidingExpireTime!=null){_memoryCache.Set(key,value,slidingExpireTime.Value);}elseif(DefaultAbsoluteExpireTime!=null){_memoryCache.Set(key,value,DateTimeOffset.Now.Add(DefaultAbsoluteExpireTime.Value));}else{_memoryCache.Set(key,value,DefaultSlidingExpireTime);}}publicoverridevoidRemove(stringkey){_memoryCache.Remove(key);}publicoverridevoidClear(){_memoryCache.Dispose();_memoryCache=newMemoryCache(newOptionsWrapper<MemoryCacheOptions>(newMemoryCacheOptions()));}publicoverridevoidDispose(){_memoryCache.Dispose();base.Dispose();}}ICacheManager缓存管理器应该,单例对象,跟踪和管理缓存对象///<summary>///Anupperlevelcontainerfor<seecref="ICache"/>objects.///AcachemanagershouldworkasSingletonandtrackandmanage<seecref="ICache"/>objects.///缓存管理器应该,单例对象,跟踪和管理缓存对象///</summary>publicinterfaceICacheManager:IDisposable{///<summary>///Getsallcaches.///获取所有缓存///</summary>///<returns>Listofcaches</returns>IReadOnlyList<ICache>GetAllCaches();///<summary>///Getsa<seecref="ICache"/>instance.///Itmaycreatethecacheifitdoesnotalreadyexists.///获取缓存实例///如果缓存不存在,则创建缓存///</summary>///<paramname="name">///Uniqueandcasesensitivenameofthecache.///缓存的唯一的名称,大小写敏感///</param>///<returns>Thecachereference</returns>[NotNull]ICacheGetCache([NotNull]stringname);}CacheManagerBase缓存管理器的基类,实现基本的操作,将具体的算法下层到子类实现///<summary>///Base>///缓存管理器的基类///</summary>publicabstract>CacheManagerBase:ICacheManager,ISingletonDependency{protectedreadonlyIIocManagerIocManager;protectedreadonlyICachingConfigurationConfiguration;protectedreadonlyConcurrentDictionary<string,ICache>Caches;///<summary>///Constructor.///</summary>///<paramname="iocManager"></param>///<paramname="configuration"></param>protectedCacheManagerBase(IIocManageriocManager,ICachingConfigurationconfiguration){IocManager=iocManager;Configuration=configuration;Caches=newConcurrentDictionary<string,ICache>();}publicIReadOnlyList<ICache>GetAllCaches(){returnCaches.Values.ToImmutableList();}publicvirtualICacheGetCache(stringname){Check.NotNull(name,nameof(name));returnCaches.GetOrAdd(name,(cacheName)=>{varcache=CreateCacheImplementation(cacheName);varconfigurators=Configuration.Configurators.Where(c=>c.CacheName==null||c.CacheName==cacheName);foreach(varconfiguratorinconfigurators){configurator.InitAction?.Invoke(cache);}returncache;});}publicvirtualvoidDispose(){DisposeCaches();Caches.Clear();}protectedvirtualvoidDisposeCaches(){foreach(varcacheinCaches){IocManager.Release(cache.Value);}}///<summary>///Usedtocreateactualcacheimplementation.///用于创建实际的缓存实现///</summary>///<paramname="name">Nameofthecache</param>///<returns>Cacheobject</returns>protectedabstractICacheCreateCacheImplementation(stringname);}AbpMemoryCacheManager使用MemoryCache实现的ICacheManager,使用具体的缓存组件实现ICacheManager,实现父类CacheManagerBase的方法///<summary>///Implements<seecref="ICacheManager"/>toworkwithMemoryCache.///使用MemoryCache实现<seecref="ICacheManager"/>///</summary>public>AbpMemoryCacheManager:CacheManagerBase{publicILoggerLogger{get;set;}///<summary>///Constructor.///</summary>publicAbpMemoryCacheManager(IIocManageriocManager,ICachingConfigurationconfiguration):base(iocManager,configuration){Logger=NullLogger.Instance;}protectedoverrideICacheCreateCacheImplementation(stringname){returnnewAbpMemoryCache(name){Logger=Logger};}protectedoverridevoidDisposeCaches(){foreach(varcacheinCaches.Values){cache.Dispose();}}}ICacheConfigurator缓存配置器,配置单个缓存项目,主要是配置创建之后的调用方法///<summary>///Aregisteredcacheconfigurator.///缓存配置器///</summary>publicinterfaceICacheConfigurator{///<summary>///Nameofthecache.///Itwillbenullifthisconfiguratorconpsallcaches.///缓存名称,如果这个配置器配置了所有的缓存,它就会是null///</summary>stringCacheName{get;}///<summary>///Configurationaction.Calledjustafterthecacheiscreated.///配置操作。在缓存创建之后调用///</summary>Action<ICache>InitAction{get;}}ICachingConfiguration缓存系统配置,配置多个ICache信息///<summary>///Usedtoconpcachingsystem.///缓存系统配置///</summary>publicinterfaceICachingConfiguration{///<summary>///GetstheABPconfigurationobject.///ABP配置值系统///</summary>IAbpStartupConfigurationAbpConfiguration{get;}///<summary>///Listofallregisteredconfigurators.///所有已注册的配置器列表///</summary>IReadOnlyList<ICacheConfigurator>Configurators{get;}///<summary>///Usedtoconpallcaches.///用于配置所有缓存///</summary>///<paramname="initAction">///Anactiontoconpcaches///Thisactioniscalledforeachcachejustaftercreated.///配置缓存的操作///这个动作在创建后的每个缓存中都被调用///</param>voidConpAll(Action<ICache>initAction);///<summary>///Usedtoconpaspecificcache.///用于配置特定的缓存///</summary>///<paramname="cacheName">Cachename</param>///<paramname="initAction">///Anactiontoconpthecache.///Thisactioniscalledjustafterthecacheiscreated.///</param>voidConp(stringcacheName,Action<ICache>initAction);}设计模式模板方法模式:ICacheManager,CacheManagerBase,AbpMemoryCacheManager,父类实现主要算法,定义调用顺序和过程,子类实现具体算法桥接模式:ICacheManager,ICache独立变化Manager和Cache,是的Manager和Cache可以独自扩展我的公众

CSS|HTML   小程序开发   运维部署  开发技巧 推荐阅读

  • MySQL ASIN() 函数 MySQL ASIN() 函数 MySQLASIN()函数返回指定数值的反正弦值。ASIN()语法这里是MySQLASIN()函数的语法:ASIN(number)参数number必需的。一个用于计算反正弦值的数值。返回值MySQLASIN()函数返回指定数值的反正弦值。如果参数number不在-1到1之间,ASIN()函数将会返回 文章阅读
  • 在 MySQL 中使用 REVOKE 语句撤销用户权限 在 MySQL 中使用 REVOKE 语句撤销用户权限 如果您面临以下的问题,或许您需要撤销用户的权限:授予了用户错误的权限授权到期了MySQL允许您使用REVOKE语句撤销授予用户的权限。MySQLREVOKE语句介绍MySQLREVOKE语句用于撤销用户帐户的一项或多项权限。MySQLREVOKE语句有几种形式。撤销一项或多项权限下面说明了REVOK 文章阅读
  • MySQL JSON_STORAGE_SIZE() 函数 MySQL JSON_STORAGE_SIZE() 函数 MySQLJSON_STORAGE_SIZE()函数返回存储一个JSON文档的二进制表示所占用的字节数。JSON_STORAGE_SIZE()语法这里是MySQLJSON_STORAGE_SIZE()的语法:JSON_STORAGE_SIZE(json)参数json必需的。一个JSON文档。它可以是 文章阅读

文章|阅读

2024年 04月29日

周一