天天看點

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)

Asp.NetCore3.1開源項目更新為.Net6.0概述需求目前解決方案

注意兩點:除了将架構目标更改為.Net6.0外,另外我分别将ImplicitUsings和Nullable設定為了disable。

目前VS2019上面隻支援.Net6.0預覽版,VS2022支援.Net6.0項目,為了将這個項目在VS2019和2022上都能運作,于是将ImplicitUsings設定為了disable,至于Nullable設定為disable是為了不想看見那煩人的警告!

接下來就是類庫更新,那就更簡單了。

Asp.NetCore3.1開源項目更新為.Net6.0概述需求目前解決方案

将之前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

繼續閱讀