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
Asp.NetCore3.1开源项目升级为.Net6.0的更多相关文章
- 微信小程序商城开源项目,Weixin-App-Shop 1.0 版本正式发布!!!
微信小程序商城开源项目,Weixin-App-Shop 1.0 版本正式发布 Weixin-App-Shop 是捷微团队开发的微信小程序商城开源项目,涵盖了微信商城的全部功能,能够快速发布简单易用的小 ...
- ASP.NET Core 开源项目整理
前言: 对 .NET Core 的热情一直没有下降过,新起的项目几乎都是采用 Core 来做开发. 跨平台是一个方面,另外就是 Core 很轻,性能远超很多开发语言(不坑). 一.ASP.NET Co ...
- ASP.NET MVC 开源项目学习之ProDinner (二)
下面我们来看第二层:Data 这一层相对来说是对Core层的具体实现了. 从命名可以看出来,这和数据库相关. 1.Db.cs CodeFirst模式的本地数据库类,继承了DbContext. pr ...
- asp.net mvc 4 项目升级到 asp.net mvc5
一.开始 1.打开或新建asp.net mvc 4项目 2.修改 global.asax文件 原: WebApiConfig.Register(GlobalConfiguration.Configur ...
- 关于把.net 2.0的项目升级到.net4.0遇到的一些问题
进入公司实习的的第一个项目又是是一个升级项目.这次升级的是一个c/s架构的项目. 大致介绍一下这个项目的结构客户端采用winform+devexpress商业控件开发的,数据库是用的oracle数据库 ...
- gradle2.0笔记——让项目升级到gradle2.0
昨晚看到QQ群消息说gradle2.0发布了,今天去看了一下,确实是昨天发布的,为rc版本:Gradle 2.0-rc-2.于是决定试一下. gradle可以在官网上下载,地址如下:http://ww ...
- ASP.NET MVC 开源项目学习之ProDinner (一)
首先在github上面将ProDinner项目通过 Git Bash 克隆到本地,接下来我们开始分析这个项目吧~ 系统采用.Net 4.5, Asp.net Mvc 5,VS2012,Sql serv ...
- 【MVC4升级到MVC5】ASP.Net MVC 4项目升级MVC 5的方法
1.备份你的项目 2.从Web API升级到Web API 2,修改global.asax,将 ? 1 WebApiConfig.Register(GlobalConfiguration.Config ...
- 【MVC】ASP.Net MVC 4项目升级MVC 5的方法
1.备份你的项目 2.从Web API升级到Web API 2,修改global.asax,将 ? 1 WebApiConfig.Register(GlobalConfiguration.Config ...
随机推荐
- [atARC086F]Shift and Decrement
将$A$操作看作直接除以2(保留小数),最终再将$a_{i}$取整 记$k$表示$A$操作的次数,$p_{i}$表示第$i$次$A$和第$i+1$次$A$之间$B$操作的次数(特别的,$p_{0}$为 ...
- ASP.NET 使用 Dispose 释放资源的四种方法
Dispose 和 Finalize 是运行的 .NET 和 .NET Core 应用程序释放占用的资源的两种方法.通常,如果应用程序中有非托管资源,应该显式地释放这些资源占用的资源. 由于 Fina ...
- radio两行每行只能选择一个的解决方案!
如图,我要做到这个效果,竖着每行只能有一个最像,和最不像,点击左边禁用右边 <div v-else> <div v-if="progress<quiz.length& ...
- 探索JavaScript执行机制
前言 不论是工作还是面试,我们可能都经常会碰到需要知道代码的执行顺序的场景,所以打算花点时间彻底搞懂JavaScript的执行机制. 如果这篇文章有帮助到你,️关注+点赞️鼓励一下作者,文章公众号首发 ...
- TVB斜率限制器
TVB斜率限制器 本文参考源程序来自Fluidity. 简介 TVB斜率限制器最早由Cockburn和Shu(1989)提出,主要特点是提出了修正minmod函数 \[\tilde{m}(a_1, a ...
- 【R】如何将重复行转化为多列(一对一转化一对多)?
目录 需求 方法一 方法二 需求 一个数据框一列或多列中有重复行,如何将它的重复行转化为多列?即本来两列一对一的关系,如何转化为一对多的关系?普通的spread函数实现较为麻烦. 示例数据如下: It ...
- 文件IO与标准IO的区别
文件IO与标准IO的区别 文件I/O就是操作系统封装了一系列函数接口供应用程序使用,通过这些接口可以实现对文件的读写操作,文件I/O是采用系统直接调用的方式,因此当使用这些接口对文件进行操作时,就会立 ...
- 39-Remove Duplicates from Sorted Array
Remove Duplicates from Sorted Array My Submissions QuestionEditorial Solution Total Accepted: 127836 ...
- 微信第三方平台获取component_verify_ticket
官方文档说明: 在公众号第三方平台创建审核通过后,微信服务器会向其"授权事件接收URL"每隔10分钟定时推送component_verify_ticket.第三方平台方在收到tic ...
- 作为Java技术面试官,我如何深挖候选人的技能
作为Java资深技术面试官,首先我感觉有必要讲解"面试官深挖问题"的动机,在了解动机的前提下,大家才能更好地准备面试.面试官为什么要在一个点上深挖?两大目的. 1 首先是通过深 ...