Asp.NetCore3.1开源项⽬升级为.Net6.0的⽅法实现
⽬录
概述
需求
⽬前解决⽅案
总结
概述
⾃从.Net6.0出来后,⼀直想之前开发的项⽬升级.Net6.0,有时想想毕竟中间还跨了个5.0版本,升级起来不知道坑⼤不⼤,最近抽时间对升级的⽅案做了些研究,然后将代码升级为.Net6.0。本质上来说我个⼈不太喜欢.Net6.0去掉main⽅法和startup,微软这么⼲让初学者学习的门槛其实是更⾼了,但阻挡不住我喜欢.Net6.0项⽬的发布包体积确实⼩等!来,开⼲吧!
⾸先我们看下aspcore3.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 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⽅法。
需求
因为aspcore3.1的项⽬我还是继续需要保持stratup,那么在AspNet.Net6.0⾥⾯如何继续保留呢?我看到官⽅⽂档⾥⾯有这么⼀句代码可以获取到webhost
var builder = WebApplication.CreateBuilder(args);
builder.Host.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
⼼想这太完美了!然后运⾏报错说是不⽀持!!都可以拿到webhost了,为何不⽀持,有知道的朋友可以说⼀下,后⾯我准备去翻下源码瞅⼀瞅!
⽬前解决⽅案
第⼀种代码案例:
Host.CreateDefaultBuilder(args)
aspnet和net的区别.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开源项⽬升级为.Net6.0的⽅法实现的⽂章就介绍到这了,更多相关Asp.NetCore3.1升级为.Net6.0内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀
持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论