- 博客(59)
- 收藏
- 关注
原创 架构整理 完美架构?
View 依赖 ViewModel;ViewModel 依赖 UI Model、SharedUI;UI Model、SharedUI无内部依赖。包含:单一完整业务用例类(挂号、建档、预约转挂号、收费确认、扣减号源)职责:串联多仓储、多领域实体,编排完整业务流程;控制执行顺序、事务逻辑;仅依赖Domain抽象仓库,不碰数据库、UI;一个UseCase只负责一件完整业务。禁止:定义业务校验规则、操作数据库、处理界面弹窗。包含:UseCase基类、业务结果统一返回包装器、事务抽象接口。
2026-07-15 08:30:00
235
原创 MAUI 创建虚拟安卓设备提示网络异常处理(修改清华镜像)
本文介绍如何将Visual Studio中Android SDK的下载源修改为清华镜像。主要步骤包括:1)在Android SDK根目录下创建/编辑repositories.cfg文件;2)添加清华镜像源配置信息;3)解决可能的权限问题。该配置适用于VS内置SDK管理器和命令行工具,可提升国内开发者的下载速度和稳定性。操作简单,只需修改一个配置文件即可完成源切换。
2026-01-07 18:13:31
454
原创 设计模式之 状态机 C#范例
C#状态机设计模式通过封装不同状态类来管理对象行为变化,核心包括状态接口、具体状态类和上下文类。该模式优势在于消除复杂条件判断、遵循开闭原则、明确状态转换规则和清晰组织代码。典型应用场景包括对象行为随状态显著变化、状态转换逻辑复杂等情况。文中以订单处理为例,展示了待确认、已确认、已发货等具体状态类的实现,以及通过上下文类管理状态转换的完整流程,同时演示了状态转换规则验证机制。
2025-10-24 09:25:57
395
原创 C# 中常用集合以及使用场景
本文总结了常见数据集合类型的特点及适用场景:数组适用于固定大小、高性能场景;List<T>适合动态增删和LINQ操作;Dictionary<TKey,TValue>用于快速键值查找;HashSet<T>保证唯一性和集合运算;Queue/Stack分别实现FIFO和LIFO;LinkedList适合频繁中间插入删除;ObservableCollection支持UI数据绑定;SortedDictionary/SortedList提供有序键值存储;ConcurrentColle
2025-08-10 15:07:17
438
原创 C# 常用的线程同步方式
多线程同步机制总结:lock语句是最常用的临界区保护方式;Mutex支持跨进程同步;Semaphore控制并发线程数;ResetEvent用于线程间信号通知;ReaderWriterLockSlim适合读多写少场景;SpinLock适合短时间等待;Interlocked提供原子操作。此外,并发集合和不可变集合内置线程安全特性。应根据具体场景选择合适机制:简单同步用lock,进程间用Mutex,控制并发用Semaphore,读写分离用ReaderWriterLockSlim,原子操作用Interlocked。
2025-08-08 13:20:45
517
原创 Prism使用消息总线打开窗体的案例(中介者模式)
在Prism框架中,弹窗事件通过ShowPopupEvent类定义,使用PubSubEvent<string>实现消息发布与订阅。PopupManager类作为中介,通过IEventAggregator订阅事件,并利用IDialogService显示弹窗。在Bootstrapper中,通过IOC容器注册弹窗对话框和单例服务,如PopupManager和IEventAggregator。MainViewModel中通过DelegateCommand发布弹窗事件,触发ShowPopupEvent并传
2025-05-18 17:51:12
436
原创 设计模式之 外观模式 C# 范例
外观模式(Facade Pattern)是一种结构型设计模式,旨在为子系统中的一组接口提供一个统一的接口。外观模式可以使得子系统的使用更加简单和高效,客户端不需要了解系统的内部细节,便可以通过外观类来访问复杂的子系统。
2024-12-15 08:30:00
404
原创 设计模式之 享元模式 C# 范例
/ 享元接口// 外部状态:颜色享元模式通过共享内存和减少对象创建次数来优化内存和性能,尤其适用于大量相似对象的场景。通过享元工厂来管理共享的享元对象,客户端可以通过传递外部状态来使用这些共享对象,从而达到节省内存和提高性能的目的。
2024-12-15 08:30:00
386
原创 设计模式之 组合模式 C# 范例
/ 组件接口,定义了所有叶子和组合对象的共同操作// 绘制图形// 添加子图形(组合对象才有此方法)// 移除子图形叶子节点是图形中的基本元素,如Circle和Rectangle,这些元素不包含任何子图形。// 叶子节点,表示单一的图形组合节点可以包含多个子图形(无论是Leaf还是其他Composite对象)。// 组合节点,表示可以包含多个图形的容器// 调用每个图形的Draw方法// 添加子图形// 移除子图形。
2024-12-14 16:00:00
654
原创 设计模式之 装饰器模式 C# 范例
Drink// 装饰器基类,继承自 IDrink 并包含对 IDrink 的引用// 默认返回基础饮品的价格// 默认返回基础饮品的描述。
2024-12-14 15:45:00
592
原创 设计模式之 桥接模式 C# 范例
IColorShape优点可以独立地扩展形状和颜色类,而不需要修改现有代码。减少了子类的数目,避免了复杂的类继承结构。使得系统能够更灵活地扩展新功能。缺点增加了系统的抽象性,学习和理解曲线较为陡峭。对于非常简单的系统,可能引入不必要的复杂性。桥接模式非常适合用在那些需要避免多重继承和扩展时,尤其是当系统的某个部分(如形状或颜色)频繁变化时。
2024-12-14 15:30:00
704
原创 设计模式之 适配器模式 C# 范例
/ Target: 定义客户端所期待的接口// Adaptee: 一个旧的播放器,只有播放 MP4 文件的功能适配器模式使得你可以在不改变现有代码的情况下,增加对新接口的支持。通过适配器类来桥接客户端代码与需要适配的类,从而实现接口的兼容性。
2024-12-14 14:45:00
929
原创 WPF 常用的5个布局容器控件介绍
Grid:适用于精确控制布局。StackPanel:适合简单的线性排列。WrapPanel:适合自动换行的布局。Canvas:适合精确位置控制,常用于图形和动画。DockPanel:适合停靠布局,适用于固定区域布局。根据应用的需求选择合适的布局容器,可以使得界面更加灵活和高效。
2024-11-30 19:56:35
896
原创 设计模式之抽象工厂 C# 范例
/ 抽象产品 Button public interface IButton { void Render();} // 抽象产品 Checkbox public interface ICheckbox { void Render();// 具体产品 WindowsButton public class WindowsButton : IButton { public void Render() { Console.WriteLine("Rendering Windows Button");
2024-11-29 11:14:50
790
原创 编程设计模式助记顺口溜
1、顺口溜创建型,工厂多,单例建对象,抽象工厂做。建造者分步做,原型克隆最不愁。结构型,适配器,桥接组合都不错,装饰外观飞享元,代理再添一把火。行为型,责任链,命令解释迭代先。中介备忘观察行,状态策略模板见。访问者真独特,并发型,线程池,读写锁,生产消。逐行解析:
2024-11-28 15:29:05
1328
原创 工厂模式(Factory Pattern)、简单工厂模式(Simple Factory Pattern)、和抽象工厂模式(Abstract Factory Pattern)使用异同点
三种工厂模式异同点,不同的应用场景
2024-08-19 12:06:56
279
原创 常用SQL集锦 好记性不如烂博客
1、查询出 某字段有值重复的记录(单个字段)select * from 表 twhere (t.username) in (select username from 表group by username having count(*) > 1)2、查找表中多余的重复记录(多个字段)select * from 表 a where (a.peopleId,a.seq) in (select peopleId,seq from 表 group by peopleId,seq having ...
2020-10-09 22:56:45
225
原创 冒泡排序
int[] array = { 1, 3, 5, 7, 90, 2, 4, 6, 8, 10 };int temp = 0;for (int i = 0; i < array.Length-1; i++){ for (int j = i+1; j < array.Length; j++) { if (array[j] < array[i]) { temp = array[i]; array[i] = array[j]; a.
2020-10-09 22:34:58
222
原创 C# MenberwiseClone/Clone 的差别
MenberwiseClone():浅复制,如果是值类型,按位复制,引用类型,复制其引用,实际上指向的是同一个对象;Clone():深复制,值类型按位复制,复制引用,并指向一份全新的对象
2020-10-04 21:09:32
265
原创 Ms SqlServer 事务使用范例
BEGIN begin tran begin try 这里写入业务代码 if(@@ERROR=0) commit tran else rollback tran end try begin catch rollback tran end catchEND
2020-09-28 10:46:08
213
原创 生成指定大小区间的随机数
public static List<int> GetUinqueRandom(int maxValue, int minValue,int count) { List<int> valuePool = new List<int>(); List<int> valueResult = new List<int>(); for (int i = minValu.
2020-09-23 22:23:09
517
原创 线程安全的单例(双if)
直接上代码namespace Test{ public class SingletonTest { object Lock = new object(); public static SingletonTest _singletonTest = null; public SingletonTest CreateInstace() { if (_singletonTest == null)
2020-09-21 23:08:16
331
1
原创 C# 反射实例化对象
经常用反射来构造对象,好记性不如烂博客,写在这里做一下笔记反射需要引用System.Reflection命名空间1、无参构造实例 Assembly assembly1 = Assembly.LoadFile("程序集路径,不能是相对路径"); //无参构造函数 object objNoParam = assembly1.CreateInstance("命名空间.具体类型"); assembly1.C.
2020-09-21 00:09:45
1333
原创 Windows Nginx 定时重启/配置日志(bat 脚本+Windows定时任务)
一、实现思路 1、使用Windows定时任务,定时执行bat脚本 2、bat脚本,逐行读取Nginx的配置文件,通过匹配字符串的方式,找到日志配置行,修改。 3、然后杀完Nginx进程,启动Nginx。就达到了配置日志的目的。 4、不使用reload的原因,生效太慢。猜想是因为项目是用的是TCP负载均衡,连接没断完,一直保留旧进程的原因二、bat脚本::关闭输出@echo off ::配置文件的绝对路径set nginxPath=C:\Users\Administa...
2020-09-18 10:33:29
1817
原创 Linq To Object 之 inner join、Left Join
直接上代码:List<Student> sList = new List<Student>(){new Student(){id=1,Name = "1",VipID = 1},new Student(){id=2,Name = "2",VipID = 1},new Student(){id=3,Name = "3",VipID = 0},new Student(){id=4,Name = "4",VipID = 2}}List<Vip> ...
2020-09-17 23:47:12
336
原创 Linq To Object 之 In 查询、Skip、Take
直接上代码范例:List<Student> list =new List<Student>(){new Student(){id= 1,Name =1},new Student(){id= 2,Name =2},new Student(){id= 3,Name =4}}var listIn= list.where(s=>new int[]{1,2}.Contatins(s.id));
2020-09-17 22:36:13
241
原创 Ms SqlServer Base64字符串解码函数
一、SqlServer 代码USE[数据库名称]GO/******Object:UserDefinedFunction[dbo].[Base64StrDecode]ScriptDate:2020/4/716:57:00******/SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOCREATEFUNCTION[dbo].[Base64StrDecode](@Base64Strvarchar(max))RETURNs...
2020-09-08 10:01:06
1778
原创 Linq To Object 之 where 记一次 【空指针异常】的处理方式以及原理
一、场景还原二、代码分析 如上图片所见代码,业务逻辑很简单,根据defaultYbPatiTypeID对ocbo_PatiType控件的数据源进行一次过滤。代码编译通过,一眼瞅上去也没什么问题,愣是报了空指针异常。三、尝试解决鉴于不能阻碍开发进度,当时尝试用了foreach常规套路解决,代码如下,测试也无问题。后加班本着不服输的精神,又回来硬着头皮解决。经过半个小时的度娘谷哥大战,终明其原理。一行代码解决。四、原理造成空指针的原因推测,是因为Linq有延迟..
2020-09-04 11:04:01
451
原创 Windows Batch 批处理脚本 停止和启动程序,可配合Windows定时任务用于自动重启方案
::关闭输出@echooff::获取当前时间setTime=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%setlogPath=%cd%\ReStartLog.txt::创建日志文件if not exist%logPath%(echo日志文件创建时间:%Time%>%logPath%)echo开始执行任务:%Time%:开始执行任务>>%logPath%::注意两个...
2020-09-01 11:10:58
1615
原创 Windows Batch bat批处理脚本 停止和启动IIS服务,可用于自动重启方案
一、直接上代码::关闭输出@echo off::获取当前时间set Time=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%set logPath=%cd%\ReStartLog.txt::创建日志文件if not exist %logPath% (echo 日志文件创建时间:%Time%>%logPath%)echo 开始执行任务:%Time%:开始执行任务>>%logPath%..
2020-09-01 11:05:20
1927
原创 Linq To Object 之 Select
一、作用 Select能够按照传入的委托的要求,完成对数据集合的过滤,并按照定义的格式返回二、直接上代码:public void Show() { List<Student> stuList = new List<Student>() { new Student() {Name = "1",ID = 1,age = 27 }, ...
2020-08-30 11:06:52
503
原创 用限定线程数量,完成多任务
#region 用限定线程数量,完成多任务 int taskCount = 10000; List<int> list = new List<int>(); for (int i = 0; i < taskCount; i++) { list.Add(i); } Action<int> a...
2020-06-07 10:40:24
369
原创 C# 带返回值异步调用函数 可用于页面初始化
函数体:private Func<T> ThreadWithReturn<T>(Func<T> WailtDo) { T ParamFunc = default(T); Thread thread = new Thread( () => { ParamFunc = WailtDo.Invoke(...
2020-06-06 17:57:34
425
原创 SqlServer 查看表的所有字段注释
SELECTA.name AS table_name,B.name AS column_name,C.value AS column_descriptionFROM sys.tables AINNER JOIN sys.columns B ON B.object_id = A.object_idLEFT JOIN sys.extended_properties C ON C.major_id = B.object_id AND C.minor_id = B.column_idWHEREA..
2020-05-14 09:46:38
3208
原创 Winform窗体嵌入外部程序 EXE
public partial class PatiCtlPacsReport : UserControl { private const int GWL_STYLE = (-16); private const int WS_VISIBLE = 0x10000000 | 0x00800000 | 0x02000000 | 0x01000000; private const int WS_VISIBLE2 = 0x40000000 | 0x0080000...
2020-05-11 18:47:50
1699
原创 C# 委托的个人浅薄的理解(个人理解笔记),不严谨, 如有错误请指出
一、什么是委托? 1、委托跟类一样,都是 可以定义的; 2、可以理解为委托是方法的一种类型,委托实现了讲一个函数作为参数传给另外一个函数的方式 3、可以理解委托是一段封装好的代码二、为什么要使用委托? 1、实现函数封装; 2、使代码更健壮和拓展性更强; 3、代码复用。三、什么时候使用委托? 比如,...
2020-04-04 21:29:51
416
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅