Asp.NetCore3.1開源項(xiàng)目升級(jí)為.Net6.0的方法實(shí)現(xiàn)
概述
自從.Net6.0出來后,一直想之前開發(fā)的項(xiàng)目升級(jí).Net6.0,有時(shí)想想畢竟中間還跨了個(gè)5.0版本,升級(jí)起來不知道坑大不大,最近抽時(shí)間對(duì)升級(jí)的方案做了些研究,然后將代碼升級(jí)為.Net6.0。本質(zhì)上來說我個(gè)人不太喜歡.Net6.0去掉main方法和startup,微軟這么干讓初學(xué)者學(xué)習(xí)的門檻其實(shí)是更高了,但阻擋不住我喜歡.Net6.0項(xiàng)目的發(fā)布包體積確實(shí)小等!來,開干吧!
首先我們看下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的代碼相比多出一個(gè)WebApplication類,作為更高一級(jí)的抽象!然后少了startup、main方法。
需求
因?yàn)閍sp.netcore3.1的項(xiàng)目我還是繼續(xù)需要保持stratup,那么在AspNet.Net6.0里面如何繼續(xù)保留呢?我看到官方文檔里面有這么一句代碼可以獲取到webhost
var builder = WebApplication.CreateBuilder(args);
builder.Host.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
心想這太完美了!然后運(yùn)行報(bào)錯(cuò)說是不支持??!都可以拿到webhost了,為何不支持,有知道的朋友可以說一下,后面我準(zhǔn)備去翻下源碼瞅一瞅!
目前解決方案
第一種代碼案例:
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
}).Build().Run();
這方式大家肯定很熟悉,就是我直接不需要WebApplication,而且還比較優(yōu)雅!
第二種代碼案例:
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();
有點(diǎn)啰嗦,但是能用,也使用了WebApplication!
基于上面這兩種方案定性選擇后,后面的項(xiàng)目就是升級(jí)第三方,速度就快多了!這里我還是以我之前的項(xiàng)目為例:
首先更改mvc項(xiàng)目的文件(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>
注意兩點(diǎn):除了將框架目標(biāo)更改為.Net6.0外,另外我分別將ImplicitUsings和Nullable設(shè)置為了disable。
目前VS2019上面只支持.Net6.0預(yù)覽版,VS2022支持.Net6.0項(xiàng)目,為了將這個(gè)項(xiàng)目在VS2019和2022上都能運(yùn)行,于是將ImplicitUsings設(shè)置為了disable,至于Nullable設(shè)置為disable是為了不想看見那煩人的警告!
接下來就是類庫升級(jí),那就更簡(jiǎn)單了。
<PackageReference Include="FluentValidation.AspNetCore" Version="10.3.5" />
將之前FluentValidation.AspNetCore從8.0版本升級(jí)為10.3.5的版本,當(dāng)然它的使用方式也發(fā)生了一些小變化!
#3.1代碼
public class LoginInputValidator : AbstractValidator<LoginInput>
{
public LoginInputValidator()
{
CascadeMode = CascadeMode.StopOnFirstFailure;
RuleFor(x => x.LoginName).NotEmpty().WithMessage("請(qǐng)?zhí)顚懹脩裘Q");
RuleFor(x => x.Password).NotEmpty().WithMessage("請(qǐng)?zhí)顚懹脩裘艽a");
RuleFor(x => x.NumberGuid).NotEmpty().WithMessage("用戶編號(hào)必須傳遞");
}
}
#6.0代碼 CascadeMode = CascadeMode.Stop;
#3.1mvc驗(yàn)證代碼
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驗(yàn)證代碼
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;
});
剩下的也是一些第三方類庫升級(jí)的事情,基本上凡是nuget以 microsoft開頭的3.1的包往6.0升級(jí)就對(duì)了。
源碼地址:https://gitee.com/shenniu_code_group/shen-nius.-modularity?
總結(jié)
到此這篇關(guān)于Asp.NetCore3.1開源項(xiàng)目升級(jí)為.Net6.0的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Asp.NetCore3.1升級(jí)為.Net6.0內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.NET Core中間件初始化的實(shí)現(xiàn)
在日常使用ASP.NET Core開發(fā)的過程中我們多多少少會(huì)設(shè)計(jì)到使用中間件的場(chǎng)景,本文探究了ASP.NET Core中間件是如何初始化的,感興趣的可以了解一下2021-05-05
asp.net中Session緩存與Cache緩存的區(qū)別分析
實(shí)現(xiàn)數(shù)據(jù)的緩存有很多種方法,有客戶端的Cookie,有服務(wù)器端的Session和Application2013-02-02
在DataTable中執(zhí)行Select("條件")后,返回DataTable的方法
在DataTable中執(zhí)行Select("條件")后,返回DataTable的方法...2007-09-09
asp.net 文件上傳與刷新與asp.net頁面與iframe之間的數(shù)據(jù)傳輸
眾所周知微軟所提供的updatepanel不能支持文件上傳的異步刷新,但是往往當(dāng)你在項(xiàng)目中的其他頁面實(shí)現(xiàn)了異步刷新之后,客戶就會(huì)問你為什么有文件上傳的頁面就不能實(shí)現(xiàn)異步刷新呢?這時(shí)我們可能說一堆理由,但是最后大部分還是會(huì)妥協(xié)于客戶。2009-12-12
viewstate和datatable動(dòng)態(tài)錄入數(shù)據(jù)示例
這篇文章主要介紹了viewstate和datatable動(dòng)態(tài)錄入數(shù)據(jù)示例,需要的朋友可以參考下2014-02-02

