初衷
net 6自2021年11月份发布以来,带来了开发者的广大好评。在评估了.net 6的优势后,我们决定在一些业务项目里升级尝试一下。
.net 6简单介绍
先看一下.net 6的介绍,以下内容来自官网博客,如有异议,请联系UU技术。
C# 10 和 F# 6 提供了语言改进,使您的代码更简单、更好。性能有了巨大的提升,我们已经看到降低了 Microsoft 托管云服务的成本。.NET 6 是第一个原生支持 Apple Silicon (Arm64) 的版本,并且还针对 Windows Arm64 进行了改进。我们构建了一个新的动态配置文件引导优化 (PGO) 系统,该系统可提供仅在运行时才可能进行的深度优化。使用dotnet monitor和OpenTelemetry改进了云诊断。WebAssembly支持更强大、更高效。添加了新的 API,用于HTTP/3,处理 JSON,数学,直接操作内存。.NET 6 将得到三年支持。开发人员已经开始将应用程序升级到 .NET 6,我们已经在生产中听到了很好的早期结果。
Net6亮点
- 使用微软服务、其他公司运行的云应用程序和开源项目对生产进行压力测试。
- 作为最新的长期支持 (LTS) 版本,支持三年。
- 跨浏览器、云、桌面、物联网和移动应用程序的统一平台,都使用相同的.NET库和轻松共享代码的能力。
- 性能在各个方面都得到了极大的提高,特别是对于文件 I/O,这两者共同减少了执行时间、延迟和内存使用量。
- C# 10 提供了语言改进,如记录结构、隐式使用和新的 lambda 功能,而编译器则添加了增量源生成器。F# 6添加了新功能,包括基于任务的异步、管道调试和许多性能改进。
- 通过热重载,您可以跳过重新生成和重新启动应用,以便在应用运行时查看 Visual Studio 2022 和 .NET CLI(适用于 C# 和 Visual Basic)的新更改。
- JSON API 功能更强大,并且使用序列化程序的源生成器具有更高的性能。
- 添加了HTTP / 3,以便 ASP.NET Core,HttpClient和gRPC都可以与HTTP / 3客户端和服务器进行交互。
- 文件IO现在支持符号链接,并通过从头开始重写大大提高了性能。
- 添加了源生成器和分析器,可帮助您生成更好、更安全、更高性能的代码。
升级步聚
去掉了Main方法和Startup.cs文件
直接用下面这种方式写就可以 (得益于顶级语句和隐式Using指令)
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.MapGet("/", () => "Hello World!");
app.MapRazorPages();
app.Run();
值得注意的是升级Net6之后 , 下面的代码 ,还是可以继续使用的
Host.CreateDefaultBuilder
中间件
.net 5项目方式:
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
}
}
.net 6改造方式:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// 启用UUPT内部中间件
app.UseUupt();
app.Run();
路由
.net 5项目方式:
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
.net 6改造方式:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
app.Run();
添加日志记录提供程序
.net 5添加方式:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
. ConfigureLogger((webHostBuilderContext, loggingBuilder) =>
{
loggingBuilder.SetOptions(new LoggerOptions(1017, "/api/Logs")
{
TimeOut = 5000
});
var list = webHostBuilderContext.Configuration
.GetLogOptions<LogOptions>(new NewtonsoftJsonProvider());
list.ToList().ForEach(options => { loggingBuilder.AddLogService(() => options); });
loggingBuilder.AddRabbitMqService(provider =>
provider.GetRabbitMqExceptionLogOptions<RabbitMqOptions>());
})
.ConfigureLogging((context, builder) =>
{
builder.AddUuptLogger(global::Microsoft.Extensions.Logging.LogLevel.Warning);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
.net 6添加方式:
var builder = WebApplication.CreateBuilder(args);
builder.Host.ConfigureLogger((webHostBuilderContext, loggingBuilder) =>
{
loggingBuilder.SetOptions(new LoggerOptions(1017, "/api/Logs")
{
TimeOut = 5000
});
var list = webHostBuilderContext.Configuration
.GetOptions<Options>(new NewtonsoftJsonProvider());
list.ToList().ForEach(options => { loggingBuilder.AddLogService(() => options); });
loggingBuilder.AddRabbitMqService(provider =>
provider.GetRabbitMqExceptionLogOptions<RabbitMqOptions>());
}
);
builder.Logging.AddUuptLogger(global::Microsoft.Extensions.Logging.LogLevel.Warning);
var app = builder.Build();
自定义依赖项注入 (DI) 容器
.net 5
Program 类
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureServices(service => service.AddAutofac())
.UseDefaultServiceProvider(options =>
options.ValidateScopes = false)
.UseStartup<Startup>();
}
.net 6方式:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAutofac();
var app = builder.Build();
添加服务
.net 5:
var hostBuilder = Host.CreateDefaultBuilder(args);
hostBuilder.ConfigureServices(services =>
{
services.AddRazorPages();
services.AddSingleton<MyThingy>();
})
.net 6写法:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSingleton<MyThingy>();
配置变更
新增了ConfigurationManager类型
改进了之前的一些问题 ,如IConfiguartionRoot 会build多次的问题 , 和提升了一些性能。 而且 ConfigurationManager 被 WebApplicationBuilder引用,使用起来就更方便了。
升级基础Lib项目多版本
我们希望不但Net6项目可以使用 ,之前的netcore3.1、.net 5也可以使用 ,可以按照下面这种方式做个兼容 ,重点是TargetFrameworks节点 ,和 Condition 属性配置
<PropertyGroup>
<TargetFrameworks>net6.0;netstandard2.0</TargetFrameworks>
<PackageId>Config.LegacyXml</PackageId>
<Version>1.0.0.8</Version>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.0.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net6.0'">
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0" />
</ItemGroup>
最后:以上相关代码,均为自己项目结合官网,隐去敏感信息后的实际代码。如有疑问,可以多多交流。
以上内容参考自: