自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 .net framework开发环境正式环境配置文件的切换

本文分享了在.NET Framework控制台项目中实现类似AspNetCore多环境配置切换的方案。通过创建appsettings.json与appsettings.dev.json,结合Autofac依赖注入,根据App.config中的Environment配置动态加载对应环境的JSON配置,并通过DbContext部分类注入自定义连接字符串,实现开发/生产环境快速切换,适用于多客户、多中间件场景,提升配置管理效率。

2026-09-21 15:27:47 294

原创 EF分页查询封装

本文分享了分页查询的封装优化方案。通过扩展 Queryable 和 DbContext,将重复代码抽象为 ApplyFilter、ToPagedListAsync 等方法,实现查询逻辑与分页分离。使用 IQueryFilter<T> 接口定义条件过滤,结合 WhereIf 实现灵活筛选,使代码更简洁、可维护。最终,查询接口从冗长的多行代码简化为链式调用,提升开发效率。

2026-09-16 16:56:15 173

原创 AspNetWebapi+WPF+Uniapp落地扫码登录

本文介绍了一个扫码登录功能的实现,作者用一周时间完成了该功能开发,代码已开源至Gitee平台(地址:https://gitee.com/jonas_shares/my-scan-login)。欢迎对该功能感兴趣的朋友进行研究探讨,如有问题可随时提出交流。该项目适合学习扫码登录实现原理及技术细节。

2026-08-10 16:10:53 71

原创 .NET分布式案例——秒杀抢购(基于.NET4.5)

本文介绍了一个基于Redis分布式锁实现的秒杀系统案例,通过C#代码演示了三种库存扣减方案:无并发控制(导致数据混乱)、线程锁(单体应用有效但效率低)、分布式锁(适用于多服务器部署)。核心逻辑在GoodsService类中实现,使用Redis的LockAsync/UnLock方法保证分布式环境下的数据一致性,并强调锁等待时间需大于业务执行时间。项目采用Nginx+IIS部署,包含服务端API和模拟并发客户端,通过商品表数量扣减验证抢购结果。Redis客户端使用单例模式管理连接,确保多请求共享同一连接。

2026-07-14 15:25:44 301

原创 Python SqlAlchemy对数据库各种操作整理(MySQL为例)

本文介绍了使用Python SqlAlchemy操作MySQL数据库的完整流程: 环境配置:安装SqlAlchemy及相关依赖包(sqlalchemy[asyncio]、aiomysql、pymysql、sqlacodegen) 模型生成:通过sqlacodegen工具自动从数据库生成模型类文件(models.py),并提供了刷新脚本(RefeshModels.bat) 数据库配置:创建异步引擎和会话工厂(AsyncSessionLocal) CRUD操作示例: 查询:基本查询、条件查询、复杂条件组合查询

2026-07-04 16:34:20 132

原创 Python Sqlalchemy学习——新增/修改/删除

本文介绍图书管理系统中新增、修改和删除操作的实现。新增书籍时先检查书名是否重复;修改操作支持单个书籍信息更新和批量价格调整;删除功能通过ID定位书籍记录。所有操作均使用异步数据库会话管理,包含必要的存在性校验,并返回明确的操作结果提示。代码采用Python异步SQLAlchemy实现,展示了完整的CRUD功能示例。

2026-06-30 10:07:18 112

原创 Python Sqlalchemy学习——查询操作集合

本文介绍了使用SQLAlchemy异步操作MySQL数据库的Python实现方法。主要内容包括:1)通过pip install安装必要的异步数据库驱动包;2)创建异步引擎和会话工厂的配置代码;3) 声明式定义Book实体模型类;4) 提供多种数据库操作示例,包括基础CRUD、条件查询(比较、模糊、逻辑运算)、聚合函数(count/avg/sum等)、分页查询(支持排序和动态条件筛选)。示例代码展示了如何利用SQLAlchemy的异步API实现高效数据库访问,特别适合需要处理高并发的Python异步应用场景。

2026-06-27 16:57:50 145

原创 设计模式——桥接模式(C#)

本文介绍了桥接模式在消息推送场景中的应用。通过抽象推送者(Pusher)和前置处理(IPreprocess)两个维度,实现了微信、钉钉等推送渠道与普通消息、错误消息等处理逻辑的自由组合。推送者基类定义了处理流程,具体推送方式由子类实现;前置处理接口允许自定义消息预处理逻辑。客户端可根据需要自由组合不同推送渠道和处理方式,如"微信+普通消息"或"钉钉+错误消息",体现了桥接模式将抽象与实现分离的思想。该设计具有良好的扩展性,可方便地添加新的推送渠道或处理类型。

2026-05-29 14:31:24 53

原创 C#设计模式——建造者模式代码案例分享

本文介绍了建造者模式的三种C#实现方式:1)标准写法通过接口和导演类分离构建逻辑;2)改进版将构建逻辑封装到抽象基类;3)链式调用版通过返回this实现方法链。三种方式都用于构建包含CPU和存储配置的Computer对象,其中游戏电脑配置为i9处理器和2TB固态硬盘。调用示例展示了不同实现的使用方式,第三种方式通过链式调用使代码更简洁。这些实现展示了建造者模式在对象构建过程中的灵活应用。

2026-05-27 22:14:48 49

原创 基于C#实现设计模式——装饰器模式案例

本文介绍了装饰器设计模式在三种场景下的应用:饮料加料、日志记录和电商优惠计算。该模式的核心思想是通过装饰器类对原有功能进行扩展,而不修改原代码,由客户端决定如何装配新功能。饮料加料示例展示了如何通过装饰器叠加牛奶和糖;日志记录示例演示了在方法调用前后添加日志;电商优惠示例则实现了满减和打折的灵活组合。这些案例都体现了装饰器模式"动态扩展功能"和"保持代码开放封闭"的优势。

2026-05-18 17:05:43 233

原创 C#实现对调用外部系统API接口封装V2

本文分享了如何封装调用第三方系统API接口的实践方案。通过抽象基类ServiceCallerBase实现通用请求逻辑(GET/POST、令牌管理、失败重试),子类可自定义认证失败判断和令牌刷新逻辑。采用泛型处理不同响应格式,并通过GetData方法提取数据。项目结构包含核心服务、控制台测试程序和WebApi示例,后者演示了如何通过DI注册多系统实例(使用key区分不同配置)。最终实现类似调用本地服务的效果,如示例中通过cllers[key].GetAsync()调用ERP系统接口查询用户信息。代码已开源在G

2026-05-15 15:04:14 215

原创 RabbitMQ在.NET中集成使用(基于.NET4.5实现)

本文介绍了RabbitMQ在.NET项目中的集成使用方法。通过三层架构实现,包含WebApi项目、消费者服务和基础服务层。重点展示了如何封装发布者(支持工作队列和广播模式)、基于Autofac的注册扩展方法,以及消费者项目的搭建流程。文中提供了测试接口示例,演示了如何向指定RabbitMQ中间件发布消息,并给出了消费者实现基类的两种模式(工作队列和发布/订阅)。项目采用.NET4.5环境,使用Autofac(4.9.1)和RabbitMQ.Client(3.6.9)实现多中间件连接管理。完整示例代码已开源在

2026-05-08 16:26:42 290 1

原创 基于AspNetWebApi封装Excel导入导出

本文介绍了一个封装好的Excel导入导出模块的设计思路与实现方案。导入功能通过读取模板首行建立属性与列索引的映射关系,利用反射将表格数据转换为对象实例;导出功能采用读取模板后填充内容的方式,建议返回二进制数据以避免文件堆积。核心服务ExcelUploadService实现了文件保存、列映射解析、数据转换等关键功能,支持必填项校验和异常处理。该模块适用于后台管理系统中的Excel数据导入导出需求,具有结构清晰、复用性强的特点。

2026-04-15 16:38:31 229

原创 基于FluentScheduler封装执行周期性任务程序(补充优化)

摘要 本文对基于FluentScheduler的周期性任务程序进行了优化改进。原方案需要为每个Job单独创建Registry类,导致类文件过多。改进后,通过重构BaseRegistry类使其支持批量接收Job数组,TaskTimerWindow窗体程序也相应调整。新方案允许将同一模块的多个Job批量注册到同一个Registry中(如示例中的MyTestRegistry),既保持了原有Job类的使用方式,又简化了注册流程。所有Job仍通过依赖注入自动初始化,只需在父类构造函数中传入即可配置执行周期。

2026-03-30 10:50:50 53

原创 AspNet服务层返回值设计分享

本文探讨了服务层返回值设计的两种常见场景:逻辑处理返回状态和返回数据。对于纯状态返回,建议使用字符串常量"OK"表示成功,错误消息表示失败。对于数据返回场景,作者最初设计了包含bool状态、消息和object数据的通用类,但发现类型转换繁琐。解决方案是通过泛型派生类ServicesResult<T>来指定数据类型,避免反复序列化。文中提供了返回字符串数组的示例代码,展示了如何优雅地返回类型化数据。这种设计既保持了原有兼容性,又解决了服务间调用的类型安全问题。

2026-03-27 16:16:23 70

原创 C#实现对调用外部系统API接口封装分享

摘要 本文介绍了一个封装外部API调用的C#工具类MyApiClient,主要解决token获取和过期重试问题。该工具类特点包括: 自动处理登录获取token流程,token过期自动刷新 支持GET/POST请求,响应统一处理为ApiResponse<T>格式 使用SemaphoreSlim保证token刷新的线程安全 当收到403状态码时自动重新获取token并重试请求 示例展示了如何初始化客户端并调用注册接口 适用于需要与外部系统交互且采用token认证的场景,可根据实际需求调整token获

2026-02-24 13:35:49 135 1

原创 对于vant picker和datetime-picker二次封装分享

本文介绍了如何封装Vant组件实现简洁的下拉列表和日期选择功能。针对Vant下拉列表组件绑定对象数组时重复代码多的问题,作者通过封装MyPicker组件简化使用,只需传入columns数组和valueKey/textKey即可。同时基于Vant的DatetimePicker封装了MyDatetimePicker组件,内置时间格式化功能。两个组件都利用Vue2的v-model语法糖,通过value属性和input事件实现双向绑定,使调用代码更加简洁。最终实现效果是将原本复杂的下拉列表代码简化为一行组件调用,提

2026-02-06 16:30:03 102

原创 element-ui table高度自适应实现分享

本文介绍了后台管理系统中表格高度自适应的实现方法。通过提取mixins封装自适应逻辑,主要思路是:表格高度=视口高度-头部搜索表单高度-其他边距。具体实现包括:1)组件首次渲染时计算高度;2)注册resize事件监听窗口变化并防抖处理;3)动态获取表单高度以应对不同尺寸下的换行情况。使用方式只需导入mixins并绑定tableHeight属性即可。示例代码展示了User组件中的实际应用,通过el-table绑定计算后的高度值,实现了表格的自动高度调整。该方法简化了开发过程,避免了重复编写计算代码。

2026-01-22 16:35:41 388

原创 基于AspNetWebApi实现简单的文件服务

本文介绍了基于AspNet WebApi(.NET4.5)实现的简单文件服务方案。该方案将文件存储在网站根目录下的Uploads文件夹中,采用"文件ID.扩展名"的命名格式。设计了三个核心接口:文件上传(支持100MB以内文件,可配置允许的扩展名类型)、获取文件路径和删除文件。通过封装工具类简化调用流程,并实现了异常处理和临时文件清理机制。这种轻量级方案适用于不需要复杂功能的系统,避免了集成minio等框架的复杂性。

2026-01-10 10:24:49 978 1

原创 WPF使用扩展方法封装对于控件的常用操作分享

本文介绍了在WPF开发中使用扩展方法封装控件常见操作的思路。通过创建静态扩展类WindowExtensions,实现了两个实用功能:1)使用DispatcherTimer为TextBox控件添加定时自动获取焦点功能;2)为TextBlock控件提供设置提示消息的方法,支持自定义消息类型(成功/错误)和颜色显示。示例代码展示了如何在窗体中调用这些扩展方法,包括3秒自动聚焦文本框和根据输入内容显示不同颜色的提示消息。这种扩展方法封装方式能简化重复代码,提高开发效率。

2025-12-08 11:11:53 143

原创 主表、明细表联表展开分页分享

摘要 本文针对主表-明细表查询中基于明细字段筛选的性能问题,提出了一种优化方案。传统方法通过主表ID查询明细存在效率问题,而直接联表分页在大数据量时性能低下。解决方案采用"明细表分页+主表关联查询"模式:首先对明细表进行分页查询和筛选,获取主表ID后再关联查询主表数据。关键优化点包括:1)将主表排序字段(如创建时间)冗余到明细表;2)将主表筛选字段(如状态、类型)冗余到明细表。文中提供了C#实现代码,通过分步查询和内存关联的方式有效提升了查询性能。

2025-11-29 16:13:47 370

原创 分页接口排序字段不唯一导致问题分享

摘要 移动端使用分页接口时出现key重复问题,发现原因是分页查询按MaterialName排序时该字段存在大量空值导致排序不稳定,第二页返回了部分重复数据。而Web端因数据拼接方式不同未报错。解决方案是改用具有唯一性的字段进行排序,确保分页数据稳定性。关键问题在于不稳定的排序字段导致分页结果不可靠。

2025-11-20 09:34:43 222

原创 查询多字段表需要返回外键信息返回值类怎么建稍微优雅点

文章摘要:针对多字段表查询中需要携带外键信息的场景,本文介绍了三种解决方案:1)通过继承EF实体类扩展属性;2)利用部分类特性直接扩展原实体类;3)采用组合方式封装关联实体。三种方法各有优劣,继承方式适合简单扩展,部分类保持代码整洁,组合方式则适用于需要完整关联对象的情况,开发者可根据实际需求灵活选择。

2025-09-28 17:00:11 366

原创 EF6使用MySql遇到问题3

VS2017更新MySQL数据库Model时出现"DDEX提供程序缺失"错误。原因是缺少VS操作MySQL的插件,需下载安装对应版本插件(1.2.10)。关闭VS后安装插件并重启即可解决问题。该问题常见于低版本VS升级后使用MySQL数据库时。

2025-09-17 10:35:37 380

原创 基于FluentScheduler封装执行周期性任务程序

本文介绍了使用FluentScheduler优化周期性任务程序的实现方法。主要改进包括:1)通过安装FluentScheduler nuget包替代原有方案;2)创建BaseRegistry和BaseJob两个基类分别管理任务注册和执行逻辑;3)支持定时执行和周期执行两种模式;4)采用依赖注入方式注册服务;5)修改窗体程序以适配新的任务管理方式。优化后的程序结构更清晰,功能更灵活,能同时满足定时和周期性任务需求。运行结果显示程序能正常输出当前时间,验证了方案的可行性。

2025-07-31 15:32:26 545

原创 WPF本地配置中心化管理

本文介绍了一种制造业系统开发中管理客户端配置信息的解决方案。通过将配置信息存储在数据库,客户端启动时根据ID加载配置,避免了因电脑损坏导致的配置丢失问题。实现步骤包括:1) 创建客户端表和配置表;2) 编写配置类,支持通用和私有配置;3) 在配置文件中设置客户端ID;4) 使用DI容器单例注入配置类;5) 在程序中调用配置信息。该方法确保了配置信息的集中管理和持久化存储,提高了系统可靠性。

2025-07-10 09:14:51 350

原创 基于DispatcherTimer封装执行周期性任务程序

这篇文章分享了一个WPF项目中实现周期性任务的解决方案。主要包含以下内容: 使用Autofac进行依赖注入,并通过配置文件动态切换启动窗体 封装了一个MyTimer基类,提供定时器初始化和执行控制功能 实现了一个显示当前时间的具体定时任务类ShowCurrentTimeTimer 创建了任务管理窗口,在窗口加载时启动所有定时器,关闭时确保任务安全停止 整个方案通过依赖注入和抽象基类设计,实现了定时任务的模块化开发和统一管理,同时考虑了任务执行的安全性问题。

2025-07-05 14:29:24 362

原创 AspNet基于ActionFilter实现DbContext统一SaveChanges操作

这篇文章介绍了在.NET WebApi项目中使用EF6时如何优雅地处理SaveChanges操作。作者提出了通过ActionFilter实现工作单元模式的解决方案,利用TransactionScope保证事务一致性。主要内容包括:1)Autofac在WebApi中的集成配置;2)自定义UsesDbContext和ManualSaveChanges特性标记;3)实现UnitOfWorkFilter,在Action执行成功后自动提交多个DbContext的变更。该方法解决了业务层Service相互调用时的Sav

2025-07-04 11:00:32 1711

原创 EF6使用MySql遇到问题2

接着上一篇博客说说EF6使用Mysql会遇到的问题。

2025-07-03 13:52:22 378

原创 EF6使用MySql遇到问题1

虽然现在很多新的项目是基于EFCore,应该还是有些朋友跟我一样为了保持项目技术栈统一,选择在.NET4.5中使用EF6。这次分享的是在DbFirst模式下,如何在.NET4.5项目中集成EF6。至于为什么要使用EF6而不使用EF5,因为WebApi项目默认引用EF6。

2025-07-02 16:55:15 485

原创 使用gRPC拦截器实现简单身份认证

之前文章通过一个简单案例介绍如何在AspNetCore中集成并使用gRPC,但是缺少身份认证。本文基于gRPC的拦截器实现简单的身份认证,这种方式一般用于我们用户管理是自己写的。若你的系统集成Identity,可以直接根据官方文档身份认证方式使用整体思路为客户端在发送请求之前在请求头中添加token,服务端拦截器中从请求头获取token并校验。我这里只是简单demo,具体的可以自行细化。

2025-06-11 17:08:31 781

原创 AspNetCore集成gRPC以及简单使用

HttpGet]return $"服务器的时间为:{reply.Datetime}";

2025-03-19 16:54:59 1633 3

原创 EF生成可精准匹配数组中多个元素表达式

EF生成可精准匹配数组中多个元素表达式

2025-03-15 11:07:40 212

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除