溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何將Asp.NetCore3.1開(kāi)源項(xiàng)目升級(jí)為.Net6.0

發(fā)布時(shí)間:2021-12-20 16:33:52 來(lái)源:億速云 閱讀:292 作者:小新 欄目:開(kāi)發(fā)技術(shù)

小編給大家分享一下如何將Asp.NetCore3.1開(kāi)源項(xiàng)目升級(jí)為.Net6.0,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

概述

自從.Net6.0出來(lái)后,一直想之前開(kāi)發(fā)的項(xiàng)目升級(jí).Net6.0,有時(shí)想想畢竟中間還跨了個(gè)5.0版本,升級(jí)起來(lái)不知道坑大不大,最近抽時(shí)間對(duì)升級(jí)的方案做了些研究,然后將代碼升級(jí)為.Net6.0。本質(zhì)上來(lái)說(shuō)我個(gè)人不太喜歡.Net6.0去掉main方法和startup,微軟這么干讓初學(xué)者學(xué)習(xí)的門(mén)檻其實(shí)是更高了,但阻擋不住我喜歡.Net6.0項(xiàng)目的發(fā)布包體積確實(shí)小等!來(lái),開(kāi)干吧!

首先我們看下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ò)說(shuō)是不支持!!都可以拿到webhost了,為何不支持,有知道的朋友可以說(shuō)一下,后面我準(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是為了不想看見(jiàn)那煩人的警告!

接下來(lái)就是類庫(kù)升級(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í)顚?xiě)用戶名稱");
            RuleFor(x => x.Password).NotEmpty().WithMessage("請(qǐng)?zhí)顚?xiě)用戶密碼");
            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;
            });

剩下的也是一些第三方類庫(kù)升級(jí)的事情,基本上凡是nuget以 microsoft開(kāi)頭的3.1的包往6.0升級(jí)就對(duì)了。

以上是“如何將Asp.NetCore3.1開(kāi)源項(xiàng)目升級(jí)為.Net6.0”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI