概述
自從.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)

注意兩點:除了将架構目标更改為.Net6.0外,另外我分别将ImplicitUsings和Nullable設定為了disable。
目前VS2019上面隻支援.Net6.0預覽版,VS2022支援.Net6.0項目,為了将這個項目在VS2019和2022上都能運作,于是将ImplicitUsings設定為了disable,至于Nullable設定為disable是為了不想看見那煩人的警告!
接下來就是類庫更新,那就更簡單了。
将之前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