课程:【.NET 6教程,.Net Core 2022视频教程,杨中科主讲】 https://www.bilibili.com/video/BV1pK41137He/?p=159&share_source=copy_web&vd_source=d944df449598b7e51bbc29cddb033275
一:.net core 初识
asp.net core 与传统asp.net form相比,更轻量级,运行速度更快,不与iis耦合,能跨平台。
传统的.netframework依赖 framework运行库,而这种传统的运行库,是系统级的,操作系统上所有依赖与这个运行库的软件都受到这个运行库影响,会出现软件的兼容冲突问题,而.net core 能独立部署,同一台操作系统上的不同.net core程序独立部署就不会相互影响,这种方式更能符合现如今的趋势。
.net standard是一种实现标准,规范,在.net core 运行时库里这种库是没有具体的实现代码,在不同的操作系统下,是由不同的代码逻辑去构造.net core的实现,比如传统的与.net core的实现是由不同路径下的dll实现的,并且用反编译软件查看其代码,发现实现代码是有差异的;而我们在写自己的 standard库时,及非.net系统standard库时,这个standard是有具体实现代码的。
从standard2.1开始,不在支持传统的.net framework了。standard1.0支持.net framework4.5。
.net core程序的发布可以独立发布和依赖发布,独立是不需要安装运行时的,而依赖是需要安装.net core运行时的。
NuGet是一种组件包安装工具,管理组件的依赖关系,能对组件进行升级和降级卸载等操作,帮助开发者更高效的复用组件,提高了开发效率。
.net官方网站:dotnet.microsoft.com
二:异步编程
异步编程,不等同于多线程,它内部的实现是一种switch的状态机,不会加快程序的运行速度。我的理解是,异步在于,服务与当前执行的代码的线程遇到了task时,就不会等待这个task任务执行完毕,顺序执行下去,而是如果这个task耗时稍微长一段时间,那么之前的线程会被线程池调去做其他任务,等await结束后,线程池会再叫一个线程服务当前执行的代码,这个服务线程就是系统执行代码的线程了,不是我们自己建立的线程。
举个例子来说,当在winform中,使用task await执行耗时任务时,是不会阻塞ui线程的执行的,我觉得是ui线程在遇到task时,就不会继续等待这个任务执行了,而是会准备响应ui的其他事件的触发,比如拖动,点击界面这些事件。
在asp.net core中,web服务器里与web程序的交互中,当web程序里有异步时,web服务器的服务线程不会因为web程序执行耗时操作,而在那儿等待,它会处于活动状态,接收web程序新的操作,这样的好处是,同样的web服务器支持的最大并发数,但是异步会提高这个并发的性能。
在异步中,不要用sleep,而是用task.dely(),sleep是阻止服务线程的执行,就会减少并发,而task.dely才是阻止当前任务的执行,不会阻塞服务与代码的线程。
CancellationToken可以提前终止异步任务的执行。
async 关键字,会把方法编译成状态机的语句,这样会降低执行效率,所以当task不需要awiat操作的时候,就不要加async关键字。
当异步遇到yield时,需要用 IAsyncIEnumerable 关键字,yieid关键字也会把代码转为状态机模式。
三、LinqToObject和委托事件
linq 内部使用方法委托,完成对集合的操作。委托是把方法当成变量进行传递,一些回调函数也就是使用的方法委托。委托可用系统提供的Actoin和Func来简化代码。委托使用的地方非常的多。事件利用了委托,事件包含事件源(发布者,触发事件的源头)和订阅者(响应事件的具体方法),事件相当于是观察者模式,能对代码进行解耦,事件用得非常得多。事件可以让类或者对象通知订阅了事件的其他对象和类。事件可以注册也可以取消订阅。
四、控制反转与依赖注入
控制反转的意思,是把创建对象的主动权交给容器。其目的是解耦,让开发者只需在需要时,注入对象,而不需要自己去创建。依赖注入(Dependency Injection,DI)是实现控制反转的其中一种方式,还有一种是服务定位器(ServiceLocator)。服务定位器需要自己通过代码去获取对象,而DI直接可以在构造函数声明形参,然后再构造函数内部赋值成员变量就行了,他们的前提是在容器内注入了对象。
依赖注入的声明周期分为:transient scope single 解释分别是瞬时、一定范围、单例。我的理解是,瞬时,每次通过注入获取的对象都是最新创建的;一定范围,在作用范围内,多次获取的对象是同一个,在asp.net core 中 使用scope注入对象,则同一个请求,多次注入都是获得的同一个对象;单例,在程序的整个周期,在asp.net core中,单例在任何请求获取的都是同一个对象。
五、系统配置
在.net core 中,支持多种配置系统 :文件、环境变量、控制台等。可以把日志的参数绑定到一个类对象。
日志还能够在使用快照选项时在文件更改时,在下一次请求里就被更新,而不需要重启程序。
对于环境变量,命令行,支持json扁平化的配置。
可以自定义代码解析自己的配置类。详见:Zack.AnyDBConfigProvider-main
六、日志系统
日志用于记录系统运行时产生的信息,日志根据信息的重要性分为:Trace
日志可以记录在控制台、文件、数据库等。需要根据每天日志的多少,设置每个日志文件的大小,也可以设置日志文件最大个数。
日志还可以通过日志等级过滤,记录到不同文件里。
SerialLog可以比Nlog更方便的实现json类型的日志,以便分析。
七、EF.Core学习
它是跨平台跨数据库的orm框架,让程序员不用写太多原生sql,也不用考虑sql方言兼容问题。
使用时,结合code-first模式会更方便。
在实体配置上,有两种方式,注解方式和fluentapi方式,前一种与实体定义耦合,后一种是不耦合的,更好。
在数据库主键设置中,如果使用自动增长,会在分布式数据库中,会出现同表id重复的情况,在系统的表合并时,也会有这种情况出现。但是好处时,查询速度快。使用guid,全球唯一,在分布式系统中好用,缺点,无法索引,查询速度慢。
它们可以综合应用,设置自增列为实际主键,但是也加入guid作为代码的逻辑主键。
sqlserver还独有支持Hi/Lo算法,一次分配一个主键段,高并发,分布式也不重复。
CodeFirst脚本迁移:Add-Migration XXX Update-Database XXX
更新到特定脚本(向上向下迁移):Update-Database –TargetMigration: AddBlogUrl
生成指定范围的脚本:Script-Migration D F
可以使用 Scaffold-DbContext命令把已有数据库表映射到项目
ef.core不能再where中使用一些自定义方法及一些复杂的方法虽然编译没问题,但是运行会报错。
在efcore的关系配置中,会自动在数据库创建外键列,但这样使用外键列时,效率会变低,所以可以手动创建外键属性映射到数据库。
有时,er关系中,一对应的一方与很多其他类关联,这时可以配置单项关系,不在一方定义list多方类的集合。
efcore支持配置自引用关系,添加一个父级id就行了,例子,菜单,组织架构。
在一对一关系中,必须显示在一方指定一个外键。
IQueryable 是sql数据库端处理数据,及筛选发生在数据库里,IEnumerable是代码端处理数据,会把所有数据查出来,在内存里筛选。IQueryable是延迟加载,只有真正使用到数据时,才会查询,IQueryable是可以复用的。
efcore还支持原生sql查询。
efcore里的实体状态:已添加,已修改,已删除,未改变,分离。首次跟踪对象时,会创建快照,savechanges,对比值。这样做,对象多了,占内存,效率不高。
efcore是不支持批量新增和修改,删除的,就是因为这个实体状态,如果批量操作,对象的状态就会混乱。在批量操作中,已经删除的对象,可能在efcore中不是已删除的状态,这时efcore一直都有的问题,这时就可以单独写sql语句完成批量操作。有个组件可以:Zack.EFCore.Batch,但还是不能解决对象状态混乱的问题。
AsNotracking意思是不跟踪状态,查询出来的对象,发生修改,删除,efcore就不会跟踪它们的状态了,就无法在savechanges保存已经更改的对象。
在efcore中,可以设置全局查询筛选器,所有查询都会隐式带上这个全局条件,比如使用逻辑删除,就不用每次都写未删除查询条件,也可以在查询中忽略全局条件。
八、锁
悲观锁:更新数据时,锁表或者锁行,在这同时,其他需要操作此表或此行数据的操作被阻塞,虽然操作简单,但并发低,不好。
乐观锁:更新数据时,不锁表锁行,更新时带个查询此列值得条件,这样做,当这个值发生改变,其他更新就找不到要更新的对象,影响行数就为0,就能提醒程序,或通过抛异常的方式。代码层面就可以再次重新查询出新值,再更新。支持高并发,但有aba的问题。更新多列,就比较麻烦。可以使用并发令牌来充当更新的where条件,因为每次操作数据库,其并发令牌列的值都会变。mysql中用datetime类型的属性设置并发列。
九、REST
面向资源的接口定义。
十、缓存
缓存分为客户端缓存,服务端页面缓存和内存缓存。
缓存穿透:数据库和缓存中都不存在的数据却访问量很高,但不命中缓存。特殊值也设置缓存
缓存雪崩:同一时间,大部分缓存失效。设置随机过期时间。
缓存击穿:单个热点key值失效,给数据库带来压力。
缓存应用:菜单,权限,热门商品,高频率访问数据库的请求。
十一、Filter与Middleware
filter是实现aop编程的一种方式。filter是属于一个middlerware的,middleware是更底层的方法,filter是控制器层面的,能拿到控制器层面的数据,而middleware不能。
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- flex学习小结
接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- ExtJs学习笔记之学习小结LoginDemo
ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- Asp.Net Core WebApi学习笔记(四)-- Middleware
Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...
- 点滴的积累---J2SE学习小结
点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...
- Core Animation学习总结
文件夹: The Layer Beneath The Layer Tree(图层树) The Backing Image(寄宿层) Layer Geometry(图层几何学) Visual Effec ...
- ASP.NET Core 2 学习笔记(七)路由
ASP.NET Core通过路由(Routing)设定,将定义的URL规则找到相对应行为:当使用者Request的URL满足特定规则条件时,则自动对应到相符合的行为处理.从ASP.NET就已经存在的架 ...
随机推荐
- 2、androidStudio调用Unity方法
1.导入Unity的Classes.jar文件 (1).首先找到这个包在哪 Unity版本为5.0之前时,classes.jar的路径: unity的安装路径\Editor\Data\Playback ...
- 在HarmonyOS上使用ArkUI实现计步器应用
介绍 本篇Codelab使用ArkTS语言实现计步器应用,应用主要包括计步传感器.定位服务和后台任务功能: 1. 通过订阅计步器传感器获取计步器数据,处理后显示. 2. 通过订阅位置服务获取位 ...
- 前端vue+elementUI如何实现记住密码功能
我们这回使用纯前端保存密码 既然是记住密码,前端也就是使用cookie保存,访问时用cookie读取 先来了解下cookie的基本使用吧 Cookie 所有的cookie信息都在document.co ...
- 为什么序列化要实现Serializable接口
为什么实现了Serializable接口就会序列化? 实现了Java中的Serializable接口的类会被称为可序列化的,这意味着它们的实例可以被序列化为字节流,以便于在网络上传输.保存到文件中或者 ...
- Spring 源码阅读(二)IoC 容器初始化以及 BeanFactory 创建和 BeanDefinition 加载过程
相关代码提交记录:https://github.com/linweiwang/spring-framework-5.3.33 IoC 容器三种启动方式 XML JavaSE: ApplicationC ...
- 【译】Visual Studio Enterprise 中的代码覆盖率特性
通过使用代码覆盖率功能,您可以发现您的测试需要改进的地方,并使您的软件更加健壮和可靠.在这篇文章中,我们将介绍我们在 Visual Studio Enterprise 2022 中引入的 Code C ...
- 迁移 Nacos 和 ZooKeeper,有了新工具
简介: 注册中心迁移在行业中主要有两个方案,一个是双注册双订阅模式(类似数据库双写),一个是 Sync 模式(类似于数据库 DTS):MSE 同时支持了两种模式,对于开通 MSE 服务治理客户,MSE ...
- 【走进RDS】之SQL Server性能诊断案例分析
简介: 数据库性能诊断不仅对其数据库技能要求较高,而且需要大量的前期准备工作,如收集各种性能基线.性能指标和慢SQL日志等,尤其是面对多数据库性能调优时,往往事倍功半. 客户的困扰 前几天某程序员小王 ...
- InnoDB之UNDO LOG介绍
简介: undo log是InnoDB事务特性的重要组成部分.当对记录做增删改操作就会产生undo记录,undo记录会记录到单独的表空间中. 本文将从代码层面对undo log进行一个简单的介绍:主要 ...
- 基于 OPLG 从 0 到 1 构建统一可观测平台实践
简介: 随着软件复杂度的不断提升,单体应用架构逐步向分布式和微服务的架构演进,整体的调用环境也越来越复杂,仅靠日志和指标渐渐难以快速定位复杂环境下的问题.对于全栈可观测的诉求也变得愈加强烈,Trace ...