• 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)

    <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>

    注意两点:除了将框架目标更改为.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升级就对了。

    总结

    关于asp.netcore3.1升级为asp.netcore6.0的项目升级想想是挺头痛的,只要肯动手稍微专研下,困难系数自动降级30%。另外,我来也录制了一些asp.netcore的视频放在B站,包括asp.netcore3.1升级为6.0的一些具体细节处理,只要搜用户“课间一起牛”就可以找到观看!

    源码地址:https://gitee.com/shenniu_code_group/shen-nius.-modularity  

    作者:课间一起牛

    出处:https://www.cnblogs.com/mhg215/

    声援博主:如果您觉得文章对您有帮助,请点击文章末尾的【关注我】吧!

    别忘记点击文章右下角的【推荐】支持一波。~~~///(^v^)\\\~~~ .

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    如果您有其他问题,也欢迎关注我下方的公众号,可以联系我一起交流切磋!

    码云:码云      github:github

  • 相关阅读:
    第十二节:类的定义
    第十二节:类的定义
    第十二节:类的定义
    Android核心技术Intent和数据存储篇
    Android核心技术Intent和数据存储篇
    Android核心技术Intent和数据存储篇
    ObjectDataSource配置数据源的时候,选择业务对象下拉菜单没有任何东西
    两个时间相差多少 .net中的timespan应用
    net3:DropDownList的动态绑定
    ADO:DataSet存入缓存Cache中并使用
  • 原文地址:https://www.cnblogs.com/mhg215/p/15711009.html
Copyright © 2020-2023  润新知