- 博客(168)
 - 资源 (13)
 - 收藏
 - 关注
 
原创 在 ABP vNext 框架中,面向切面编程(AOP,Aspect-Oriented Programming)的详解
ABP vNext框架通过动态代理和拦截器实现面向切面编程(AOP),解决横切关注点问题。核心机制基于Castle DynamicProxy,在方法调用前后插入拦截逻辑,内置功能包括事务管理、审计日志、权限验证、缓存和异常处理。开发者可通过特性(如[UnitOfWork]、[Authorize])快速应用这些功能,无需修改业务代码。此外,ABP支持自定义拦截器,只需实现IInterceptor接口并注册即可扩展AOP功能,实现业务特定逻辑(如耗时统计)。这种设计保持了代码的纯净性和可维护性。
          2025-10-22 11:40:13
          
667
        
原创 c# ABP vNext 框架详解及其模块化开发思想介绍
ABP vNext 摘要 ABP vNext 是基于 ASP.NET Core 的开源企业级框架,采用模块化架构和领域驱动设计(DDD)。核心特性包括: 模块化开发 - 支持功能模块独立开发与复用 DDD支持 - 提供分层架构和领域模型实现 基础设施集成 - 内置认证授权、数据访问、多租户等企业级功能 依赖注入 - 深度集成ASP.NET Core DI容器 框架通过模块类(AbpModule)定义模块生命周期,自动处理模块依赖和加载顺序。开发实践建议按领域分层组织代码,通过接口定义模块边界,实现高内聚低耦
          2025-10-22 10:42:23
          
1102
        
原创 Redis 缓存击穿、缓存雪崩和缓存穿透
缓存击穿与缓存雪崩的解决方案 缓存击穿指热点Key失效瞬间引发大量请求穿透到数据库,可通过分布式锁、热点Key永不过期或预热+随机过期时间解决。缓存雪崩则是大量Key同时失效或缓存集群宕机导致数据库压力骤增,可通过过期时间随机化、多级缓存、熔断降级等方案应对。两者都需避免请求集中穿透到数据库,但解决方案各有侧重:击穿针对单个热点Key,雪崩处理大规模Key失效问题。合理设计缓存策略可有效提升系统稳定性。
          2025-10-21 14:00:41
          
436
        
原创 C# 基础——async/await 的实现原理与最佳实践
C#中的async/await通过状态机机制将异步代码转换为类似同步的写法,底层依赖任务并行库实现非阻塞操作。最佳实践包括:优先返回Task而非async void;库代码使用ConfigureAwait(false)避免死锁;始终用await代替阻塞等待;正确处理异步异常;遵循命名规范。理解其原理可编写高效无死锁的异步代码,避免常见陷阱。
          2025-10-21 00:16:56
          
918
        
原创 C#基础——GC(垃圾回收)的工作流程与优化策略
C#的垃圾回收(GC)机制通过代际回收(0/1/2代)自动管理内存,采用标记-清理-压缩流程回收无用对象。优化策略包括减少对象创建(使用值类型/对象池)、处理大对象碎片、避免内存泄漏(及时释放资源)以及选择合适的GC模式(工作站/服务器)。高性能场景需监控GC行为,通过工具诊断问题,重点降低内存分配压力,确保应用性能。
          2025-10-20 23:28:03
          
1104
        
原创 C# 基础——装箱和拆箱
摘要: C#中的装箱将值类型转换为引用类型(如int转为object),需在堆上分配内存并复制数据;拆箱则是反向操作,需类型检查并复制值回栈。两者因涉及堆分配和数据复制,存在性能开销。常见于非泛型集合(如ArrayList)操作,可通过泛型集合(如List<T>)避免。开发中应减少不必要的装箱拆箱以优化性能,同时理解其内存机制有助于排查效率问题。核心区别在于装箱是值→引用(堆分配),拆箱是引用→值(类型验证+复制)。
          2025-10-20 23:15:08
          
368
        
原创 C# 基础——值类型与引用类型的本质区别
摘要:C#中值类型和引用类型的核心区别在于数据存储方式。值类型直接存储数据,通常分配在栈上,赋值时复制完整数据;引用类型存储对象地址,数据在堆上,赋值时复制引用。值类型生命周期由作用域管理,引用类型由GC回收。值类型包括基本类型、结构体和枚举,引用类型包括类、接口等。特殊地,string虽是引用类型但表现出值类型特性。理解这些差异对避免编程错误至关重要。
          2025-10-20 23:12:15
          
786
        
原创 C# 基础——多态的实现方式
C#多态实现方式解析:通过继承+虚方法重写(virtual/override)、抽象类+抽象方法(abstract)、接口实现(interface)以及隐藏基类方法(new关键字)四种方式实现"同一接口不同实现"。其中虚方法重写和抽象类实现动态绑定(运行时确定),接口实现跨类别行为契约,而new关键字实现静态绑定(编译时确定)。虚方法重写和接口实现最为常用,能够提升代码扩展性和可维护性。
          2025-10-20 22:58:34
          
778
        
原创 C# 设计模式——单例模式
C#单例设计模式确保类仅有一个实例,并提供全局访问点。核心实现包括:私有构造、静态私有实例和公共访问点。常见实现方式有:1)饿汉式(线程安全但非延迟加载);2)懒汉式(延迟加载但非线程安全);3)双重检查锁定(线程安全且延迟加载);4)静态内部类(推荐方式,简洁无锁);5).NET4+的Lazy<T>(最佳实践)。注意防范反射攻击和序列化问题,确保单例唯一性。不同方案在延迟加载、线程安全和实现复杂度上各有特点,可根据场景选择。
          2025-10-20 18:08:24
          
852
        
原创 C# 设计模式——工厂模式
C#中的工厂设计模式通过封装对象创建过程,实现"使用"与"创建"解耦,主要包括三种形式:简单工厂模式通过一个工厂类根据参数创建对象,但违反开闭原则;工厂方法模式为每个产品创建对应工厂,符合开闭原则但会增加类数量;抽象工厂模式用于创建相关联的产品族(如跨平台UI控件),能保证产品之间的兼容性。三种模式各有适用场景,能有效提高代码的灵活性和可维护性。
          2025-10-20 17:33:08
          
496
        
原创 C# 设计模式——观察者
/ 观察者接口:定义更新方法// 接收主题通知时调用,参数为主题传递的数据(这里是温度)// 主题接口:定义管理观察者和通知的方法// 添加观察者// 移除观察者// 通知所有观察者。
          2025-10-20 17:19:34
          
947
        
原创 什么是单点登录(SSO)?用 C# 实现一个简单的单点登录
单点登录(SSO)是一种统一认证机制,允许用户通过一次登录访问多个相互信任的系统,无需重复验证。其核心组件包括认证中心、子系统和身份令牌,通过JWT等令牌实现分布式认证。本文详细介绍了SSO的原理、价值及C#实现方案,基于ASP.NET Core和JWT搭建认证中心与子系统,涵盖JWT配置、登录接口实现等关键步骤,提供完整的代码示例,帮助开发者快速构建企业级统一认证系统。
          2025-10-18 23:59:16
          
144
        
原创 python OpenCV+Milvus 实现人脸比对介绍,以及实现流程及代码
本文提出一种基于OpenCV和Milvus的人脸比对方法,通过结合计算机视觉与向量数据库实现高效人脸识别。系统采用OpenCV进行人脸检测与图像预处理,利用face_recognition库提取128维人脸特征向量,并借助Milvus向量数据库存储和快速检索特征数据。文章详细介绍了技术原理、环境配置和核心实现,包括Milvus集合的初始化、特征向量索引构建、相似度搜索等关键步骤。该方法通过余弦相似度计算实现人脸匹配,支持自定义阈值判定,具有部署简单、检索高效的特点,为人脸识别应用提供了完整的解决方案。
          2025-10-18 22:16:28
          
771
        
原创 c# .NET core多线程的详细讲解
.NET Core 多线程编程摘要: 本文系统介绍了.NET Core多线程技术,涵盖基础概念(线程、并发/并行)、核心API及适用场景。重点讲解了三种实现方式:1) Thread类提供底层线程控制,适合精细化管理;2) ThreadPool优化线程复用,适合短期任务;3) Task异步模型(推荐)简化编程,支持返回值。文章通过代码示例演示各API用法,对比分析优缺点,指导开发者根据CPU/I/O密集型等场景选择合适方案,提升程序性能与资源利用率。
          2025-10-18 21:20:12
          
1007
        
原创 c# 基础——泛型的详细介绍
C# 泛型技术通过类型参数(如<T>)实现代码复用和类型安全,解决了传统方法中代码冗余(为每种类型重复编码)和使用object导致的类型不安全与性能损耗(装箱拆箱)问题。泛型支持类、方法、接口和委托四种形式:泛型类(如GenericStack<T>)可创建通用数据结构;泛型方法(如Swap<T>)实现类型无关的操作;泛型接口(如IComparable<T>)提供类型安全的契约;泛型委托(如Func<T>)支持多态方法调用。泛型在编译时进行类型检查,
          2025-10-18 19:21:05
          
1079
        
原创 Entity Framework Core和SqlSugar的区别,详细介绍
EFCore和SqlSugar是.NET生态中两大主流ORM框架,各有特点。EFCore由微软开发,强调领域驱动设计,适合复杂业务场景,提供完整的实体映射和迁移功能,但学习成本较高。SqlSugar是国内开发的轻量级ORM,注重性能与开发效率,支持灵活SQL控制和批量操作,适合快速开发项目。两者在查询语法、事务管理、多库支持等方面存在差异:EFCore基于LINQ实现类型安全查询,SqlSugar提供更接近SQL的链式API。性能方面,SqlSugar在批量处理上更优。选择时需考虑项目规模,大型系统推荐EF
          2025-10-18 17:51:34
          
831
        
原创 C# 中,依赖注入(DI)的实现方式
在 C# 中,依赖注入(DI)的实现方式主要分为手动注入和通过 IoC 容器注入(如 .NET 自带的 Microsoft.Extensions.DependencyInjection)。以下是具体代码示例,涵盖常用场景和最佳实践。
          2025-10-18 11:24:08
          
1032
          
1
        
原创 docker (56) Recv failure: Connection reset by peer
docker 运行一个spring boot的api接口项目,在虚拟机上测试:报错:(56) Recv failure: Connection reset by peer。
          2024-02-21 17:11:33
          
1266
        
原创 vue前端项目命令框输入npm run serve报error:03000086:digital envelope routines::initialization error错误
vue前端项目命令框输入npm run serve报error:03000086:digital envelope routines::initialization error错误。也可以执行:export NODE_OPTIONS=--openssl-legacy-provider。然后再执行:npm run serve。
          2024-02-02 09:30:00
          
729
        
原创 supervisorctl重启服务
其中,program配置指定了进程的名字,command指定了启动脚本的路径,autostart和autorestart则表示自动启动和自动重启。startretries指定了尝试启动应用程序的次数,user指定了应用程序运行所用的用户,directory指定了应用程序所在的工作目录,stdout_logfile和stderr_logfile分别指定了应用程序的标准输出和标准错误输出的日志文件。supervisorctl可以帮助我们在Linux服务器上管理和监控运行在后台的进程,包括自动重启服务。
          2024-01-29 18:02:34
          
2852
        
原创 测试 ASP.NET Core 中间件
正常情况下,中间件会在主程序入口统一进行实例化,这样如果想单独测试某一个中间件就很不方便,为了能测试单个中间件,可以使用单独测试。
          2024-01-16 18:25:48
          
764
        
原创 .Net Core 使用 AspNetCoreRateLimit 实现限流
上一篇文章介绍过使用.NET 7 自带的中间件可以实现简单的Api限流,但是这个.NET 7以后才集成的中间件,如果你使用的是早期版本的.NET,可以使用第三方库AspNetCoreRateLimit实现Api限流。AspNetCoreRateLimit 是一种 ASP.NET Core 速率限制解决方案,旨在根据 IP 地址或客户端 ID 控制客户端可以向 Web API 或 MVC 应用发出的请求速率。
          2024-01-16 15:55:36
          
2389
        
原创 asp.net core项目发布到 iis上
我们都知道与传统asp.net 项目比较,ASP.NET Core则完全不同,它并不是运行在IIS的工作进程中,而是独立运行的。它运行于控制台应用程序之中,控制台中则运行了Kestrel Web服务器组件。Kestrel作为一款.NET Web服务器的实现,它在吞吐量性能方面做了很多工作。它可以快速将来自网络的请求接入到应用程序中,但是它仅仅是一个最基本的Web服务器。它没有类似IIS的Web管理服务,也没有IIS那么多的功能。
          2024-01-12 18:21:19
          
922
        
原创 .NET core 中的Kestrel 服务器
什么是Kestrel?Kestrel 是一个跨平台的Web服务器,会默认在ASP.NET Core 项目模板中对其进行配置。未使用 IIS 托管时,ASP.NET Core 项目模板默认使用 Kestrel。在下面的模板生成的Program.cs中,方法在内部调用。
          2024-01-12 11:40:46
          
4661
        
原创 .NET 反射的介绍和简单应用
反射还支持的更高级的行为,能在运行时动态创建新类型,并且对这些新类型的操作进行调用。发现信息(如名称、事件处理程序的数据类型、自定义特性、声明类型以及事件的反射的类型),并添加或删除事件处理程序。来定义和加载程序集,加载程序集清单中列出的模块,以及在此程序集中定位一个类型并创建一个它的实例。发现信息(如名称、数据类型、声明类型,反射的类型和属性的只读或可写状态),并获取或设置属性值。发现信息,如参数的名称、数据类型、参数是输入参数还是输出参数以及参数在方法签名中的位置。发现信息,如名称、访问修饰符(如。
          2024-01-11 17:26:33
          
1371
        
原创 swagger Actions require an explicit HttpMethod binding for Swagger/OpenAPI 3.0报错处理
相关的Attribute。正常逻辑来说那就给每个Action添加HttpMethod呗,但是往往情况就出现在不正常的时候。因为项目是迁移的老项目,先不说私自改了别人代码带来的甩锅问题,公司的WebApi项目很多,这意味着Action很多,如果一个项目一个项目的去找Action添加HttpMethod可是一个不小的工作量,而且开发人员工作繁忙,基本上不会抽出来时间去修改这些的,因为这种只是Swagger不行,,否则就报这一大堆错误。这里的HttpMethod其实就是咱们常用。
          2024-01-04 16:59:39
          
1097
        
原创 .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
但是这存在一个问题,不是所有接口会按照定义的数据格式返回,除非每个接口都返回我们自定义的类,这种实现起来不太现实。我们需要不管接口定义的返回类型是什么,最后的结果都是统一的数据格式,需要实现这个功能就需要自定义一个过滤器来实现。附上 ApiResponse.cs IApiResponse.cs 代码。之前写过使用自定义返回类的方式来统一接口数据返回格式,时,把这个响应结果拿出来,再判断是不是。类型来确定这个返回结果是否包装过。没包装的话就给包装一下,就这么简单。在代码中进行判断,当响应的类型是。
          2023-12-21 15:41:09
          
2022
          
2
        
原创 .net 隐式自定义类型转换运算符 static implicit operator
public static implicit operator T1(T2 t) static implicit operator static implicit operator static implicit operator
          2023-12-21 14:47:42
          
878
        
原创 .Net Core webapi RestFul 统一接口数据返回格式
json对象中data是返回的实际结果对象,可以是一个对象、一个list、一个字符串、一个数字......分别实现类带有泛型的 ApiResponse 类和 ApiResponse 类。的隐式转换,所以就完美解决这个问题,大大减少了代码量。注意在泛型类中,使用运算符重载,实现了。中,我们定义了一个运算符重载,实现了。但是整体的json格式要以上面的为准。2、使用过滤器(Filter)实现。类型呀,这不是类型不一致吗?1、自定义一个统一返回类。但这接口的返回值明明是。创建对应的接口和实现类。
          2023-12-21 14:02:59
          
3698
          
1
        
原创 .Net Attribute 特性 自定义特性(二)
在实际开发中,我们经常看到如MVC中标记在方法上的 [HttpGet] [HttpPost][HttpDelete][HttpPut] ,序列化时标记在类上的 [Serializable] ,使用EF标记属性的 [Key] ,使用特性的地方随处可见。二次升级已完成,看看代码,瞬间心情舒畅。细心的朋友会发现,校验返回的都是true跟false,每次遇到校验不通过的字段后下面的都不再校验了,想要返回所有未校验通过的字段,并告诉调用者,一次性把所有字段都按照格式填好,这样才是我们想要的效果。
          2023-12-20 11:40:51
          
1426
        
原创 .Net Attribute 什么是特性、预定义特性使用(一)
特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。在.Net 框架提供了两种类型的特性预定义特性和自定义特性。在.net框架内提供了三种预定义特性,经常使用特性或对特性有了解的朋友肯定见到过或用过。obsolete预定义特性。
          2023-12-19 17:55:42
          
1123
        
原创 .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
【代码】.NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证。
          2023-12-18 17:26:14
          
1022
        
原创 .NET Core中鉴权 Authentication Authorization
Authentication:鉴定身份信息,例如用户有没有登录,用户基本信息Authorization:判定用户有没有权限使用框架提供的Cookie鉴权方式1.首先在服务容器注入鉴权服务和Cookie服务支持2.注册鉴权和授权中间件,用于在管道中调用拦截校验鉴权和授权3.在控制器引入特性 [Authorize] ,调用登录接口时使用HttpContext.SignInAsync()写入鉴权信息
          2023-12-18 16:48:16
          
1089
        
原创 用一个简单的例子教你如何 自定义ASP.NET Core 中间件(一)
中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件:选择是否将请求传递到管道中的下一个组件。可在管道中的下一个组件前后执行工作。请求委托用于生成请求管道。 请求委托处理每个HTTP请求。一句话总结:中间件是比筛选器更底层,更上游的面向切面技术,其性能最高,可处理的应用范围远比过滤器广,如实现网关,URL转发,限流等等。
          2023-12-18 15:42:21
          
525
        
原创 用一个简单的例子教你如何 自定义ASP.NET Core 中间件(二)
如果没有实现 InvokeAsync 方法运行会报错:“找不到'Hero.Jwt.MyMyMiddleware'类型的中间件的公共'Invoke'或'InvokeAsync'方法。上一章已经说过了,中间件是一种装配到应用管道以处理请求和响应的软件。新建一个静态类:MyMiddlewareExtensions。公共方法,参数必须保持一致,它是中间件执行的入口。新建一个类:MyMiddleware。必须要在构造函数里面申明请求委托。自定义中间件必须要实现。
          2023-12-18 15:39:32
          
531
        
原创 .NET core JWT身份认证实现
首先我们知道jwt中一定会有的字段有Issuer,Audience,另外jwt有过期时间,所以要有代表生命周期的Lifetime,表示续期的RenewalTime,然后是头字段,是否验证失效时间,是否验证签名等,于是就有了如下结构. JwtConfig.cs在Hero.Jwt中定义一个叫做JwtConfig的类,表示针对jwt的所有配置信息,ciset;set;/// 签名keyset;/// 生命周期set;/// 续期时间set;/// 是否验证生命周期set;/// 验证头字段set;
          2023-12-15 18:30:02
          
2339
        
原创 垃圾回收 (GC) 在 .NET Core 中是如何工作的?(二)
接上一篇文章GC 会分配堆段,其中每个段都是一系列连续的内存。置于堆中的对象归类为 3 个代系之一:0、1 或 2。代系可确定 GC 尝试在应用不再引用的托管对象上释放内存的频率。编号较低的代系会更加频繁地进行 GC。对象会基于其生存期从一个代系移到另一个代系。随着对象生存期延长,它们会移到较高代系。如前所述,较高代系进行 GC 的频率较低。短期生存的对象始终保留在第 0 代中。例如,在 Web 请求存在期间引用的对象的生存期较短。应用程序级别单一实例通常会迁移到第 2 代。
          2023-12-14 15:23:41
          
1232
        
原创 垃圾回收 (GC) 在 .NET Core 中是如何工作的?
提起GC大家肯定不陌生,但是让大家是说一下GC是怎么运行的,可能大多数人都不太清楚,这也很正常,因为GC这东西在.NET基本不用开发者关注,它是依靠程序自动判断来释放托管堆的,我们基本不需要主动调用Collect()释放内存,只需要注意对非托管资源进行及时释放就行。,其中每个段都是一系列连续的内存。置于堆中的对象归类为 3 个代系之一:0、1 或 2。代系可确定 GC 尝试在应用不再引用的托管对象上释放内存的频率。编号较低的代系会更加频繁地进行 GC。对象会基于其生存期从一个代系移到另一个代系。
          2023-12-14 11:45:26
          
1743
        
python 华容道拼图小游戏
2022-10-28
mysql-connector-net-6.8.3
2018-06-04
ChineseConverter.dll ChnCharInfo.dll
2018-01-04
AnkhSVN 2.7.0.6493msi 支持vs2015
2017-10-26
ThoughtWorks.QRCode.dll
2018-01-04
        
      
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅