【Blog.Core开源】将Program升级为.NET6.0版本

3dd8690b43aa81517c3142cf377a534d.png

大家假期好,好久不见,之前忙于其他事情,公众号暂时搁置了一个月了,新的一年开始了,很多小伙伴开始催更了,粉丝的要求必须满足。

2022年打算重点推广BCVP社区,所以还是希望有愿意投稿的小伙伴,积极投稿哟。同时我也有以下几个打算,欢迎广而告之:

1、还是有很多小伙伴对Blog.Core的学习内容和技术知识不是很清晰,所以打算每月开一个直播,主要是以直播公开课的形式分享里边的知识架构(B站直播);

2、同时也把之前欠的技术难点给补充上,比如GitHub上说的最多的就是部门数据的权限功能(开发中)、数据迁移优化和项目完全升级为.NET6.0(本文所讲);

3、继续讲讲微服务相关的内容(B站视频录播);

以上三个知识点会慢慢铺开来进行,也欢迎更多的小伙伴公司使用Blog.Core,如果公司有使用,可得老张技术指导。

老张

https://github.com/anjoy8/Blog.Core/issues/75

废话不多说,直接开始今天的内容分享。

d26ae2c6832fa1bc136d44d663e1f045.png

需求说明

ASP.NET6.0正式版已经出来了半年多了,作为一个LTS版本,也是受到官方的强烈推荐和升级建议,自然,作为有3.7k个Star的Blog.Core已经在第一时间更新了6.0,并且一直健壮的运行了很久了,只不过遗留了一个功能点:6.0版本优化了Program.cs的写法,并把Startup.cs给优化掉了,看上去是一个Mini精简版本——采用新的宿主模型。

最小宿主模型:
1)、大大减少了创建应用程序所需的文件和代码行数。只有一个文件需要四行代码。同时也新增特性最小API模型。
2)、Startup.cs将和 Program.cs 合并到单个 Program.cs 文件中。
3)、使用顶级语句减少应用程序所需的代码。
4)、使用全局 using 指令消除或最大程度地减少所需的 using 语句行数。

不过很多小伙伴表示看着别扭和不太习惯,同时我也考虑到我的博客中,都是老的版本,就一直没升级,不过昨天也是尝试了一波,表示改写起来也是比较简单的。

相关的代码已经提交到了GitHub上的mini-program分支,如果大家一周内没问题,我会merge到master分支,欢迎大家clone代码尝试,如果有错误欢迎提issue,如果有其他疑问和建议也欢迎提issue,我会帮助解答。

过程很简单,这里列举下有哪些问题点。

0f6f63e1504c361654c0c983f425769c.png

1、使用隐式命名空间引用

如果我们创建一个空的.net6.0webapi项目,可以看到program.cs内容是这样的:

var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();var app = builder.Build();// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI();
}app.UseAuthorization();app.MapControllers();app.Run();

这里是没有using命名空间的,但是如果我们在类和方法上点击F12,也能看到具体的程序集。同时也没有定义具体的类名和方法名,所以才导致很多小伙伴表示看着比较别扭。

如何实现的呢,就是在.csproj文件里,启动隐式命名空间引用即可:

<ImplicitUsings>enable</ImplicitUsings>

打开obj目录(用于存放编译过程中生成的中间临时文件),在cs文件的对应目录发现了WebApplication1.GlobalUsings.g.cs文件:

a6ab8980db8f4a27aff58e968c422a06.png

虽然看着别扭,但是整体其实也能看的明白,还是定义host、注册服务和配置中间件这三个步骤,两个核心关键点就是.build()完后,容器里才会注册具体的服务实例,.run()完后,项目就正式的启动起来了。

咱们把官方给的写法拷贝到Blog.Core中,就可以改造了。

同时要注意另一个null的配置,如果配置了在controller的action中,会校验空值的,必须传参,所以我的建议还是不开启:

<Nullable>enable</Nullable>

3023221df9a0acfc53f2be0cd8d4e9ef.png

2、配置自定义注入容器

首先说下以官方容器为默认容器,是如何做依赖注入服务注册的,和之前很像:

builder.Services.AddScoped<UseServiceDIAttribute>();
builder.Services.AddSingleton(new Appsettings(builder.Configuration));

用的是builder.Services来处理,将之前的service前边,统一加上builder即可。

当然咱们也用到Autofac,所以需要配置自定义的注入容器:

builder.Host
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(builder =>
{builder.RegisterModule(new AutofacModuleRegister());builder.RegisterModule<AutofacPropertityModuleReg>();
})

其他的日志配置和app参数配置和之前一样,具体参考Blog.Core代码即可。

8a114118a28e7ab1ce0d3b0b31c52c40.png

3、如何使用配置和环境参数

在第一步中,已经生成了builder,官方已经给我们做好了处理,所以直接作为属性拿来用即可:

262df2073341d3022a655b233021f497.png

aa4e56d948de4a69322517f910bbd35a.png

4、中间件什么时候开始?

上边的过程是准备阶段,我们把builder.build()后,构建完成,开始配置中间件管道了。

// 3、配置中间件
var app = builder.Build();if (app.Environment.IsDevelopment())
{app.UseDeveloperExceptionPage();
}
else
{app.UseExceptionHandler("/Error");//app.UseHsts();
}app.UseIpLimitMiddle();
app.UseRequestResponseLogMiddle();
app.UseRecordAccessLogsMiddle();
app.UseSignalRSendMiddle();
app.UseIpLogMiddle();
app.UseAllServicesMiddle(builder.Services);
// and so on...

其他的也直接copy过来就行。

d9bd1a1a6e65393a330d417677efc34a.png

5、中间件使用依赖注入服务

在之前的写法中,我们中间件可以作为一个类似构造函数那样,将接口注册,但是现在没有这些东西了,从哪里获取服务呢,比如我们开启QuarzNet任务,可以用原生的写法,从容器ServiceProvider中获取:

var tasksQzServices = scope.ServiceProvider.GetRequiredService<ITasksQzServices>();
var schedulerCenter = scope.ServiceProvider.GetRequiredService<ISchedulerCenter>();
app.UseSeedDataMiddle(myContext, builder.Environment.WebRootPath);
app.UseQuartzJobMiddleware(tasksQzServices, schedulerCenter);

改到这里就没有什么了,直接执行.run()方法就行了。

f3777b6fb0b42c037c58042a6e175903.png

6、其他需要注意的点

1、Swagger自定义html的Stream

因为Program类的原因,不能直接用this.GetType()了,可以换这种写法:

Assembly.GetExecutingAssembly()
.GetManifestResourceStream("Blog.Core.Api.index.html")

2、其他调用Program.cs

Program使用最小宿主模式后,在其他类库里会访问受限,所以要换成其他的

0aa6bf5e0dcd094986a93a7c227c7ec9.png

其他的还没有遇到有需要更新的,Blog.Core也是比较全的项目了,基本涵盖了平时大家开发的功能,当然,如果有自己把握不住的,欢迎GitHub上提issue。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python画两条曲线_查找在matplotlib中绘制的两条曲线之间的区域(在区域之间填充)...

我有两条曲线的x和y值列表&#xff0c;它们都有奇怪的形状&#xff0c;而且我没有任何函数。我需要做两件事&#xff1a;&#xff08;1&#xff09;绘制它并对曲线之间的区域进行着色&#xff0c;如下图所示&#xff1b;&#xff08;2&#xff09;找到曲线之间该着色区域的总面…

OXY OPENCART 商城自适应主题模板 ABC-0020-05

OXY OPENCART 商城自适应主题模板 ABC-0020-05OXY FEATURESLayoutFoundation Framework – the most advanced responsive front-end framework in the world.100% Fully Responsive – Solid Flexible Responsive Layout that scales from 320px to 1440px.You can disable re…

年月跨度_建筑结构丨国内跨度最大的张弦桁架工程——合肥滨湖国际会展中心二期首榀桁架滑移成功...

来源&#xff1a;中建科工 华中大区。2020年12月8日全国公建领域最大跨度的张弦桁架钢结构工程合肥滨湖国际会展中心二期首榀桁架滑移顺利完成合肥滨湖国际会展中心二期项目位于合肥市滨湖新区锦绣大道与广西路交口&#xff0c;该项目2#综合馆建筑面积约4.8万平方米&#xff0c…

【C#/.NET】不用AutoMapper,我用啥呢?

微信公众号&#xff1a;趣编程ACE关注可了解更多的.NET日常实战开发技巧。如需源码请后台留言源码;**[如果觉得对您有帮助&#xff0c;欢迎关注]TinyMapper简介本文来自社区群粉丝投稿TinyMapper是一个.NET平台下的一个轻量级对象映射工具&#xff0c;号称是.Net平台下最快的对…

HBase键值分片的简单运用

1.基本原理介绍 HBase的存储是通过行键建立索引进行存储的&#xff0c;而且HBase只支持一级索引&#xff0c;因此只要通过行键才能很快的找到需要的数据。HBase是一个分布式的系统&#xff0c;HBase通过行键的分片&#xff0c;把不同的数据存储在不同的主机上。1).顺序分片依据…

我要3万取款机怎么取_7万的新宝骏RS-3怎么样?用车三个月后,车主说出了实话...

小型SUV领域&#xff0c;作为目前SUV市场之中竞争最激烈的细分领域之一&#xff0c;已经成为众多车企的必争之地。而正因如此&#xff0c;小型SUV市场所具有的车型非常的丰富&#xff0c;且其中更是一点也不缺爆款车型&#xff0c;正如在去年底刚上市的一款小型SUV——新宝骏RS…

MODIS数据说明

MODIS目前主要存在于两颗卫星上&#xff1a;TERRA和AQUA。TERRA卫星每日地方时上午10:30时过境&#xff0c;因此也把它称作地球观测第一颗上午星(EOS-AM1)。AQUA每日地方时下午过境&#xff0c;因此称作地球观测第一颗下午星(EOS-PM1)。两颗星相互配合&#xff0c;每1-2天可重复…

.NET 为大型应用接入 ApplicationStartupManager 启动流程框架

对于大型的应用软件&#xff0c;特别是客户端应用软件&#xff0c;应用启动过程中&#xff0c;需要执行大量的逻辑&#xff0c;包括各个模块的初始化和注册等等逻辑。大型应用软件的启动过程都是非常复杂的&#xff0c;而客户端应用软件是对应用的启动性能有所要求的&#xff0…

思科为其核心网络业务增加了订阅服务

据国外媒体报道&#xff0c;思科系统公司的核心网络业务于周二开始进军订阅服务市场&#xff0c;其向大型企业宣布了一系列新的安全和自动化工具。 这个新的“直观网络”代表了思科如何从其旗舰业务中获得收入的重大变化。San Jose公司一直依赖于网络设备的销售&#xff0c;这些…

if函数python_pythonif函数

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; python的内置的函数round() a 1.12586 #保留小数的函数,四舍五入&#xff0c;参数为保留小数点后的位数 pr…

Foundatio - .Net Core用于构建分布式应用程序的可插拔基础块

简介Foundatio - 用于构建分布式应用程序的可插拔基础块•想要针对抽象接口进行构建&#xff0c;以便我们可以轻松更改实现。希望这些块对依赖注入友好。•缓存&#xff1a;我们最初使用的是开源 Redis 缓存客户端&#xff0c;但后来它变成了具有高许可成本的商业产品。不仅如此…

开讲啦观后感2017计算机科学家,开讲啦观后感2017

1 开讲啦观后感2017(一)是因为有爱&#xff0c;我才付出的&#xff0c;因为是我爱的&#xff0c;而我又付出了&#xff0c;所以我会更爱。这是郑教授的演讲《你为什么读大学》中给我映像最深刻的一句话。我也能从这句话中找到我读大学的原因因为我爱。古时候说你十年寒窗苦读&a…

php 解压zip

2019独角兽企业重金招聘Python工程师标准>>> /*** 解压zip* param type $file* param type $destination* return boolean*/public function unzip_file($file, $destination){ $zip new ZipArchive() ; if ($zip->open($file) ! TRUE) {return $this->error…

如何评价国内SRC纷纷上线“白帽子协议”?

2017年6月1日21:21分 某监狱里&#xff0c;对话如下&#xff1a; 犯人A:你们都是怎么来的&#xff1f; 犯人B:我是XX漏洞平台挖漏洞不小心进来的。 犯人C:我是XX平台路人甲&#xff0c;输错命令了rm -rf / &#xff08;批量删除&#xff09; 犯人D:我是某测评中心的忘了要授权了…

SQL Server数据库备份的镜像

SQL Server数据库备份的镜像 原文:SQL Server数据库备份的镜像SQL Server数据库备份的镜像 一个完整备份可以分开镜像 USE master GOBACKUP DATABASE [testdatabase] TO DISK NC:\testdatabase1.bak MIRROR TO DISK ND:\testdatabase2.bak WITH FORMAT, INIT GO 一个完整备份…

C# 观察文件的更改

使用 FileSystemWatcher 可以监视文件的更改。事件在创建、重命名、删除和更改文件时触发。这可用于如下场景&#xff1a;需要对文件的变更做出反应&#xff0c;例如&#xff0c;服务器上传文件时&#xff0c;或文件缓存在内存中&#xff0c;而缓存需要在文件更改时失效。因为 …

php 自动创建目录

2019独角兽企业重金招聘Python工程师标准>>> /*** 创建目录* param type $path* param type $mode* return type */public function rmkdir($path, $mode 0777) {return is_dir($path) || ( $this->rmkdir(dirname($path), $mode) && $this->_mkdir(…

油管螺纹尺寸对照表_yt15硬质合金刀片尺寸|A320焊接刀头参数

硬质合金刀片牌号表示方法如下图&#xff1a;yw1硬质合金刀片a320钨钛钴类硬质合金主要成分是碳化钨、碳化钛(TiC)及钴。其牌号由“YT”(“硬、钛”两字汉语拼音字首)和碳化钛平均含量组成。例如&#xff0c;YT15&#xff0c;表示平均碳化钛(TiC)15%&#xff0c;其余为碳化钨和…

python实验原理_Python实验报告八

安徽工程大学Python程序设计 班级&#xff1a;物流192 姓名&#xff1a;唐家豪 学号&#xff1a;3190505234 成绩&#xff1a; 日期&#xff1a;2020/06/03 指导老师&#xff1a;修宇 【实验目的】 &#xff1a; 掌握读写文本文件或 CSV 文件&#xff0c;进而对数据进行处理的方…

.NET 6 使用 Obfuscar 进行代码混淆

本文来安利大家 Obfuscar 这个好用的基于 MIT 协议开源的混淆工具。这是一个非常老牌的混淆工具&#xff0c;从 2014 年就对外分发&#xff0c;如今已有累计 495.5K 的 nuget 下载量。而且此工具也在不断持续迭代更新&#xff0c;完全支持 dotnet 6 版本&#xff0c;对 WPF 和 …