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

上一篇:微软 Blazor 对比其他技术栈在实际应用中的缺点是什么?


下一篇:.NET 的内存管理机制(五)