網站首頁 編程語言 正文
概述
自從.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升級就對了。
源碼地址:https://gitee.com/shenniu_code_group/shen-nius.-modularity?
總結
原文鏈接:https://www.cnblogs.com/mhg215/p/15711009.html
相關推薦
- 2022-04-19 開發中為什么用translate來改變位置而不是定位?
- 2022-04-26 Entity?Framework?Core延遲加載(懶加載)用法_實用技巧
- 2022-12-22 如何使用python獲取現在的日期與時間_python
- 2022-09-13 iOS封裝倒計時按鈕HLCountDownButton示例詳解_IOS
- 2022-03-20 關于數據庫系統的概述_數據庫其它
- 2024-02-16 springboot開啟mybatis二級緩存
- 2023-06-17 Flask中特殊裝飾器的使用_python
- 2022-12-24 C++中的函數返回值與拷貝用法_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支