1. 程式人生 > 程式設計 >Asp.NetCore3.1開源專案升級為.Net6.0的方法實現

Asp.NetCore3.1開源專案升級為.Net6.0的方法實現

目錄
  • 概述
  • 需求
  • 目前解決方案
  • 總結

概述

自從.Net6.0出來後,一直想之前開發的專案升級.Net6.0,有時想想畢竟中間還跨了個5.0版本,升級起來不知道坑大不大,最近抽時間對升級的方案做了些研究,然後將程式碼升級為.Net6.0。本質上來說我個人不太喜歡.Net6.0去掉main方法和startup,微軟這麼幹讓初學者學習的門檻其實是更高了,但阻擋不住我喜歡.Net6.0專案的釋出包體積確實小等!來,http://www.cppcns.com開幹吧!

首先我們看下asp.netcowww.cppcns.comre3.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 =>
                {
    www.cppcns.com
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.RucAAnolS
n();

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>
   http://www.cppcns.com </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.Newtonsofton" 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

總結

到此這篇關於Asp.NetCore3.1開源專案升級為.Net6.0的方法實現的文章就介紹到這了,更多相關Asp.NetCore3.1升級為.Net6.0內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!