12 2022 档案
摘要:看到下面的项目结构,是否曾经相识?不要笑,这也是一种项目结构,极简主义。 项目结构没有对错,合适就好,但也要有几个要求,至少要做到结构明确,清晰,当然上图的结构清晰,但不明确,不知道各个Form是做什么的。 那么至少要给各个文件准确命名,不管命名规则如何,只要统一,明确就行,比如下面的图。 三层 窗
阅读全文
摘要:由于WinForm的UI是绘制的,所以在加载大量数据数据时会有一定的延时,本篇就讨论几个减少延时的方法。 在加载有规律数据时,可以考虑用递归,简单方便快捷来加载数据,如下,把一个文件夹下的所有文件或文件夹加载到树形菜单上,以树形展示,代码实现如下。 var rootPath = "d://abc/b
阅读全文
摘要:我们在控件那篇文章里说过,窗体和控件都是一个类,项目中一个个窗体,都是Form类的子类。关于这个类有几个重要的成员,也是最常用成员,以供初学者了解: Load事件:发生在构造函数后,Shown事件前,这个事件的生命周期内,窗体是不可视化的。 Shown事件:当窗体发生前窗体有轮廓画出,事件结束后整个
阅读全文
摘要:在WinForm项目中,很多时候会映遇上多线程一起工作的情况,因为当前UI的更新显示,是在主线程中,一但主线程被长时运算占据后,UI就会被卡信,出现假死现像。那么就需要起一个新线程做长时运算工作,把进度或数据同步回UI线程。 以一个医保上传数据为例,功能是同步药品,器械,诊疗项目,同步完后进行验证核
阅读全文
摘要:WinForm是基于控件的,不像code+mark的架构,可以非常灵活的用mark来布局,它只能用控件布局属性和窗口控件来完成对UI的布局。 容器控件有一组控件叫容器控件,对布局特别有作用,它们分别是:TableLayoutPanel:表格布局面板,每个单元格都可以用来作为其他控件的载体,通过设置行
阅读全文
摘要:窗体无疑是WinForm的主角,每个窗体都是用一个class来承载,那么窗体的控件,就是类中的私有字段了。每个窗体有三个文件,两个.cs文件,是一个分部类,Designer.cs是自动生成的C#代码,一般是拖拽控件后生成的代码;另一个.cs文件是写业务代码用的;第三个是.resx文件,是资源文源,窗
阅读全文
摘要:首先声明,这只是一种登录方式,并不是最好的方式,用这个例子为了说明登录窗体和Application的关系。 在登录前,定义了用户实体,然后是一个通用的类,存放进程中当前登录的用户,所以CurrentUser是静态类。 internal class User { public int ID { get
阅读全文
摘要:WinForm所见即所得的UI设计框架,开发效率确实有所提升,同时降低了编程门槛,让WinForm更普及。拖拖拽拽就能设计出一个界面,那么我们拖拽的这些东西是什么?它们是什么原理?。 WinForm我觉得很好的一点是,把所有东西都对像化(毕竟C#是面向对象的语言),包括可视化的窗体,控件等,当然有的
阅读全文
摘要:基本上有独立进程的应用,都是以Main函数作为入口,开始运行的。在C#中,Main函数可以无参无返回值,当然也可以是有string[]参数和int返返回值的。WinFrom也满足这个规则。 那么Main作为一个进程的开始函数,那么是谁传这些参数呢?然后又是谁来接收这个返回值呢?显然不可能是进程本身,
阅读全文
摘要:WinForm程序只能运行在Windows上,即使是基于.NET5,6,7也一样。因为WinForm的UI层对接的底层API是基于Windows的。 用VisualStudio创建一个WinForm应用很简单,建议使用非.NET Framework版,因为.NET Framework微软渐渐不支持了
阅读全文
摘要:(注:本篇用点长,有点绕,耐心浏览) C#中类型分为值类型和引用类型,值类型存储在堆栈中,是栈结构,先进后出,引用类型存储在托管堆中。接下来用不安全代码的地址,来看一下值类型和引用类型的存储。 项目文件 C#中使用不安全代码需要在项目文件中添加AllowUnsafeBlocks配置。 <Projec
阅读全文
摘要:前几在用MiniAPI时还想没有比较优雅的缓存,这不,Preivew6就带来了。使用起来很简单,注入Sevice,引用中间件,然后在Map方法的后面跟CacheOutput()就ok了,CacheOutpu也有不同的参数,可以根据每个方法定制,当然也可以有全局配置,在添加Service时进行统一配置
阅读全文
摘要:最近在做一个简单的风控,其中有一块需求是这样的,当主请求参数到达后,会根据这些参数,看调起几个并发规则,这些规则各自有自己的验证逻辑,每个规则执行时间长短都不确定,当规则 执行完后,返回主请求,主请求根据规则验证返回结果,从而决定是否立即response请求,但其他后到的规则 ,要继续完成后面验证,
阅读全文
摘要:之前自己实现过一个CSRebot命令行工具,现在用System.CommandLine来实现,就规范和省事多了,虽然System.CommandLine还没有正式发布,但它的实现思路还是很不错的。 下面的代码只简单实现了MSSQL库生成C#体类的功能,其他库或其他语言的实体类生成,大家可以自己实现一
阅读全文
摘要:Preview5对策略验证的方式没有改变,只不过内置了Token的生成,和《.NET6之MiniAPI(十):基于策略的身份验证和授权》的验证方式基本相同,都是生成和验证使用的验证参数要一致,用继承AuthorizationHandler的子类来作每次请求的验证。 在具体的路由上,用RequireA
阅读全文
摘要:在.NET7的Preview5中,优化了asp.net core中的JWT验证,不用像以前繁琐了,更重要的是带来了一组生成Token的工具,可以让开发人员或测试人员不需登录获取Token,而达到测试的目的。 创建项目 现在来看一下怎么使用,首选创建项目,/是无验证,/myhome是有验证 var b
阅读全文
摘要:.NET Preview5中,给MiniAPI带来了一个参数绑定的功能,看到这个功能,我一下子就开心了,因为它提供了一个把松散的传入数据或注入功能耦合在一起的能力,并且可以根据自己的需求自由组合,结合上原来的Fromxxx(Name="")]使用,尤其和谐。 看一下下面的例子,如果每个请求都带有X-
阅读全文
摘要:前两篇说到Command和Option,这篇说说Argument。Argument的用法和Option很像,只是他的构造和属性有些差别,再就是在运行输入时有区别,接下来看看实现。 一个参数 //创建根命令 var rootCommand = new RootCommand("这是一个命令行工具:旦猫
阅读全文
摘要:前一篇简单看了一下CommandLine命令的使用,其实在一个命令行工具中,还有一个重要的点,那就是选项——Option,选项是为命提供参数,就好像C#中方法,Command就像方法,Option就像方法的参数,说到参数就有参数类型,形参(形式参数名称),同理,CommandLine也有,看一个带O
阅读全文
摘要:记得之前出过几篇.net tool工具的文章,当时的做法是所有工具的语法分析全部自己解释,自己执行,语法的解释占了大部分时间,反而工具的功能被弱化了。 其实微软有一个CommandLine框架在缓慢的发展着,至今都没有正式发布,那就是System.CommandLine。可以通过NuGet来引用Sy
阅读全文
摘要:(注:本文参照 NickChapsas的Attributes get a feature long-overdue in C# 11) 今天看一个泛型特性的例子,这个功能在C#11才受支持。 在asp.net core mvc中,可以给action添加filter,达到拦截作用,实现如下: publ
阅读全文
摘要:在asp.net mvc或asp.net miniapi中,有过滤器,可以在请求前或后增加一层,达到验证,过滤等作用,如果在Service的方法前后加一层呢?这里介绍一下Castle.DynamicProxy的用法。 首先引入 Castle.Core 实现代码相对轻量: using Castle.D
阅读全文
摘要:当年在做go时,很羡慕它的时间有微秒,纳秒,在做性能优化时,能很小颗粒度的查看引入方法执行的时间,当时.net的DateTime只有毫秒(虽然也有别的办法获取)。现在,在最新的.NET7 Preview4中,DateTime也有微秒和纳秒了,倍感亲切。 纳秒在百位上,没有十位和个位,但这也说明.NE
阅读全文
摘要:为了更好的测试,更好的性能,Preview4带了一个新的请求返回值类型,这个新的类型中封装了所有的Http请求返回状态函数,还包括了返回成功后的几种数据类型,下面列举了几个常用的类型: app.MapGet("/test_ok", () => { return TypedResults.Ok<Dat
阅读全文
摘要:这篇是“闻(看)香(码)识(学)女(技)人(术)”。 这也是一个有意思的功能,路由分组,啥也不说了,看代码看结果: using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.OpenApi; var builder
阅读全文
摘要:在MiniAPI系列中,《.NET6之MiniAPI(十八):OpenAPI swagger》介绍了swagger在MiniAPI框架中的使用,当时留下很多不足,随着.NET7 Preview4的推出,这方面得到了很大的改进,我还是使用“十八”这篇文章的案例。 如果想参看原来文章,见下面引用: 《.
阅读全文
摘要:一觉醒来,发现微软带来了.NET7 Preview4的更新,本次更新关于MiniAPI的还不少,难以掩饰的喜悦心情,促使我尽快把这个消息分享给大家,那下来我们看一下一共带来了哪些关于MiniAPI的更新: 返回值带来了TypedResults,这样进一步地丰富了返回值的多样性: app.MapGet
阅读全文
摘要:.net core下迎来了WCF——CoreWCF1.0,做了一个最初级的Demo,尝尝鲜。 首先在NuGet中引入下面两个包 CoreWCF.Http CoreWCF.Primitives 本demo是用WCF实现一个ToDoList的几个服务端方法,然后用创建客户端服务调用,代码如下: WCF服
阅读全文
摘要:有时,为了省事,我们也可以把窗体的控件注入到ServiceCollection中,在razor中订阅事件,这样就省了中间的桥梁,直接用控件当桥梁,下面以一个Button和Timer为例,来展示使用方式。 本例是把Button和Timer注入到ServieCollection,在razor中通过引用注
阅读全文
摘要:在上一篇中介绍了一下razor文件中,js与c#之间的相互调用,但WinForm和Blazor混合中,没有真正与WinForm进行交互,本篇来说明一下。 WinForm中混合Blazor是通过ServiceCollection来完成的,如果想WinForm和Blazor交互,可以通过向Service
阅读全文
摘要:在Debug程序时,面对一些大集合,之前是这样查看的,如下图,这样看起来不直观,集合中的数据只能一个一个实体查看: VS2022预览版带来一个新功能,集合表格可视化,比如下面这样一段代码: using Bogus; using System.Text.Unicode; var addressFake
阅读全文
摘要:这一直以来是我写代码的一个痛点,C#11终于解决了,那就是我想把一个整齐的格式的json字符串转出,但不能如愿,要不用一个三方库来搞定,要不就加各种双引号,如果有变量还得小心处理{},因为在C#string类型中 @,$,",{,}都是有含义的,组合使用后就各种转义,补齐,C#11终于解决了这个痛点
阅读全文
摘要:“为什么中间件的构造函数里不能使用scope的生命周期类型啊?”, 那就用实例来得到答案吧,先看小桂说的情况,是报错的: var builder = WebApplication.CreateBuilder(args); builder.Services.AddScoped<ITestService
阅读全文
摘要:.NET7的第三个预览版发布了,同样带来了mini api的更新,这次带来了路由过滤器,与mvc版的action 过滤器相似。具体见https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-dotnet-7-preview-3/ 用官
阅读全文
摘要:把一个数组的全部元素加1,有什么好办法,于是有了下面的分析: var arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; //方法一 foreach (var i in arr) { i++; } //方法二 for (var i = 0; i < arr.
阅读全文