Asp.NetCore3.1开源项目升级为.Net6.0

概述

自从.Net6.0出来后,一直想之前开发的项目升级.Net6.0,有时想想毕竟中间还跨了个5.0版本,升级起来不知道坑大不大,最近抽时间对升级的方案做了些研究,然后将代码升级为.Net6.0。本质上来说我个人不太喜欢.Net6.0去掉main方法和startup,微软这么干让初学者学习的门槛其实是更高了,但阻挡不住我喜欢.Net6.0项目的发布包体积确实小等!来,开干吧!

首先我们看下asp.netcore3.1的program代码:

public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});}

其次我们看下asp.net core6.0的 program代码

var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();var app = builder.Build();// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI();
}app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.Run();

6.0和3.1program的代码相比多出一个WebApplication类,作为更高一级的抽象!然后少了startup、main方法。

需求

因为asp.netcore3.1的项目我还是继续需要保持stratup,那么在AspNet.Net6.0里面如何继续保留呢?我看到官方文档里面有这么一句代码可以获取到webhost

var builder = WebApplication.CreateBuilder(args);builder.Host.ConfigureWebHostDefaults(webBuilder =>
{webBuilder.UseStartup<Startup>();
});

心想这太完美了!然后运行报错说是不支持!!都可以拿到webhost了,为何不支持,有知道的朋友可以说一下,后面我准备去翻下源码瞅一瞅!

目前解决方案

第一种代码案例:

Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
}).Build().Run();

这方式大家肯定很熟悉,就是我直接不需要WebApplication,而且还比较优雅!

第二种代码案例:

var builder = WebApplication.CreateBuilder(args);var startup = new Startup(builder.Configuration);
startup.ConfigureServices(builder.Services);var app = builder.Build();
startup.Configure(app, app.Environment);app.Run();

有点啰嗦,但是能用,也使用了WebApplication!

基于上面这两种方案定性选择后,后面的项目就是升级第三方,速度就快多了!这里我还是以我之前的项目为例:

首先更改mvc项目的文件(csproj)

<Project Sdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>net6.0</TargetFramework><Nullable>disable</Nullable><ImplicitUsings>disable</ImplicitUsings><RootNamespace>ShenNius.Mvc.Admin</RootNamespace><GenerateDocumentationFile>False</GenerateDocumentationFile><SignAssembly>False</SignAssembly></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"><NoWarn>1701;1702;CS1591</NoWarn></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"><NoWarn>1701;1702;CS1591</NoWarn></PropertyGroup><ItemGroup><PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.10" /><PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.17" /><PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.9" /><PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.5" /></ItemGroup><ItemGroup><ProjectReference Include="..\ShenNius.Admin.API\ShenNius.Admin.API.csproj" /></ItemGroup>
</Project>

注意两点:除了将框架目标更改为.Net6.0外,另外我分别将ImplicitUsings和Nullable设置为了disable。

目前VS2019上面只支持.Net6.0预览版,VS2022支持.Net6.0项目,为了将这个项目在VS2019和2022上都能运行,于是将ImplicitUsings设置为了disable,至于Nullable设置为disable是为了不想看见那烦人的警告!

接下来就是类库升级,那就更简单了。

<PackageReference Include="FluentValidation.AspNetCore" Version="10.3.5" />

将之前FluentValidation.AspNetCore从8.0版本升级为10.3.5的版本,当然它的使用方式也发生了一些小变化!

3.1代码   public class LoginInputValidator : AbstractValidator<LoginInput>{public LoginInputValidator(){CascadeMode = CascadeMode.StopOnFirstFailure;RuleFor(x => x.LoginName).NotEmpty().WithMessage("请填写用户名称");RuleFor(x => x.Password).NotEmpty().WithMessage("请填写用户密码");RuleFor(x => x.NumberGuid).NotEmpty().WithMessage("用户编号必须传递");}}6.0代码CascadeMode = CascadeMode.Stop;
3.1mvc验证代码      
mvcBuilder.AddFluentValidation(options =>{var types = Assembly.Load("ShenNius.Share.Models").GetTypes().Where(e => e.Name.EndsWith("Validator"));foreach (var item in types){options.RegisterValidatorsFromAssemblyContaining(item);}options.RunDefaultMvcValidationAfterFluentValidationExecutes = false;});6.0 mvc验证代码      mvcBuilder.AddFluentValidation(options =>{var types = Assembly.Load("ShenNius.Share.Models").GetTypes().Where(e => e.Name.EndsWith("Validator"));foreach (var item in types){options.RegisterValidatorsFromAssemblyContaining(item);}options.DisableDataAnnotationsValidation = true;});

剩下的也是一些第三方类库升级的事情,基本上凡是nuget以 microsoft开头的3.1的包往6.0升级就对了。

总结

关于asp.netcore3.1升级为asp.netcore6.0的项目升级想想是挺头痛的,只要肯动手稍微专研下,困难系数自动降级30%。另外,我来也录制了一些asp.netcore的视频放在B站,包括asp.netcore3.1升级为6.0的一些具体细节处理,只要搜用户“课间一起牛”就可以找到观看!

源码地址:https://gitee.com/shenniu_code_group/shen-nius.-modularity  

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

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

相关文章

ios开发备忘录三

为什么80%的码农都做不了架构师&#xff1f;>>> 在配置第三方库EGORefreshTableHeaderView的时候&#xff08;其实就只是一个头文件和一个源文件&#xff0c;还算不上库&#xff09;&#xff0c;可以从头文件发现 #import <QuartzCore/QuartzCore.h> 所以必…

Android之Eclipse下面如何看Android源代码

在看代码的时候,会经常用到 ctrl鼠标左键 去看自己写的类,有时候点到java的类或者android的类就无法打开,显示no class found之类的东西, 1.拿Button举例,ctrl加鼠标左键,然后显示了no class found之后,这时候会发现整个页面只有一个按钮可以点击,就是change attach source,如果…

项目管理 计算机仿真,分析计算机仿真技术在工程项目施工管理中的运用.pdf

第 33 卷 第 1 期(上) 赤 峰 学 院 学 报( 自 然 科 学 版 ) Vol. 33 No.12017 年 1 月 Journal of Chifeng University (Natural Science Edition) Jan. 2017分析计算机仿真技术在工程项目施工管理中的运用林振文(厦 门软件职业技 术学院 &#xff0c; 福 建 厦 门 361024 )摘…

C# 企业微信消息推送对接,实现天气预报推送

准备工作需要获取的东西1. 企业Id,2.应用secret 和 应用ID获取企业id注册完成后&#xff0c;在我的企业》企业信息》最下面企业id获取应用secret 和 应用ID发送微信消息class WeCom{public static string weComCId "ww2b b0bf8";//企业Id①public static string we…

通信协议——HTTP、TCP、UDP

TCP HTTP UDP:都是通信协议&#xff0c;也就是通信时所遵守的规则&#xff0c;只有双方按照这个规则“说话”&#xff0c;对方才能理解或为之服务。TCP HTTP UDP三者的关系:TCP/IP是个协议组&#xff0c;可分为四个层次&#xff1a;网络接口层、网络层、传输层和应用层…

++i 与 i++

i 与 i都能实现自增,它们的区别在哪? i:先自增,然后返回引用. i:先进行一个本地备份(可以理解为定义一个临时变量),自增,然后返回临时变量的引用. 理论上来讲,i操作会快于i,但由于现代编译器做了优化.所以,i与i在性能上的并无差别.转载于:https://www.cnblogs.com/heavenyes/p…

Visual Studio 远程调试正在运行的进程

使用场景当项目在测试环境上有bug&#xff0c;需要运行代码调试一下&#xff0c;这时就需要在测试环境上安装一个调试工具&#xff0c;然后在本地运行代码&#xff0c;远程链接到测试环境服务器来调试代码&#xff1b;&#xff08;假期鸽了这末长的时间&#xff09;方式一&…

直男约会能有多奇葩​?

1 六根烟来了七位领导怎么办&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 和36号鞋垫一样大的毛肚&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 直男约会能有多奇葩&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 高情商v…

Android之如何解决adb server is out of date,killing...ADB server didn't ACK

今天&#xff0c;久未出现的著名的“adb server is out of date. killing”又发生了&#xff0c;在此&#xff0c;将解决方法记下&#xff0c;以便日后查看。 1. 错误信息&#xff1a; C:\Users\lizy>adb devices adb devicesadb server is out of date. killing... ADB …

计算机如何实现共享接入,局域网内电脑实现共享设置方法

不同局域网内电脑怎么实现互访实现文件或打印机共享设置?下面由学习啦小编给你做出详细的实现共享设置方法介绍!希望对你有帮助!局域网内电脑实现共享设置方法&#xff1a;一、使用一条网线将两个路由器连接&#xff0c;网线插在路由器的LAN口上;二、两个路由器要设置两个不同…

python的内建函数详解

python内建函数最近一直在学习python&#xff0c;在网上看到和学习了关于python内建函数的一些分类和个内建函数的作用&#xff0c;下面是一些关于python内建函数的罗列&#xff0c;初学者的了解&#xff0c;分类可能不准确&#xff0c;一起交流。一、数学运算类abs(x)求绝对值…

【另类见解】一致性哈希就能解决分库分表问题了?

“开局一问&#xff1a;分库分表行为中&#xff0c;一致性哈希到底用处大不大&#xff1f;装B脑图现在是大数据的时代&#xff0c;其中一个体现就是数据量非常庞大。当然大数据的概念绝非是数据量就可以定义的&#xff0c;我自己给大数据下的定义是&#xff1a;无处不在的大量数…

DNS resolving 占用大量日志

公司内部DNS配置好后&#xff0c;测试解析正常&#xff0c;只是几乎每秒都有无法解析的日志产生。但分析日志时发现&#xff0c;每天的日志都有2G左右。日志中几乎全是类似network unreachable resolving www.baidu.com/A/IN:2001:5023:c27::2:30#53network unreachable resolv…

SQL Server 2008之DMF

陈述式管理架构&#xff0c;一个用于SQL Server数据库引擎的新的基于策略的管理框架 DMF是一个基于政策的用于管理一个或多个SQL Server 2008实例的系统。要使用DMF&#xff0c;SQL Server政策管理员使用SQL Server 管理套件创建政策&#xff0c;这些政策管理服务器上的实体&am…

Android之ActivityManage长用方法总结

Android 如何判断一个应用在运行 在一个应用中&#xff0c;或一个Service 、Receiver中判断一个应用是否正在运行&#xff0c;以便进行一些相关的处理。这个时候我们需要得到一个ActivityManager&#xff0c;这个Manager顾名思意就是管理Activity的&#xff0c;它有一个方法叫g…

计算机网络就业范围分析,计算机网络技术专业就业前景怎么样「就业形势分析」...

计算机网络技术专业作为目前的热门专业之一&#xff0c;在就业方向上可以有哪些选择?计算机网络技术专业就业前景如何?下文小编给大家整理了计算机网络技术专业的最新就业形势分析&#xff0c;供参考!1.掌握计算机网络技术专业的基本理论、基本知识;2.掌握计算机网络技术专业…

Codeforces Round #358 (Div. 2) A. Alyona and Numbers 水题

A. Alyona and Numbers题目连接&#xff1a; http://www.codeforces.com/contest/682/problem/A Description After finishing eating her bun, Alyona came up with two integers n and m. She decided to write down two columns of integers — the first column containing…

pomForSSH

2019独角兽企业重金招聘Python工程师标准>>> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache…