初衷

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

升级步聚

去掉了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>

最后:以上相关代码,均为自己项目结合官网,隐去敏感信息后的实际代码。如有疑问,可以多多交流。

以上内容参考自:

性能提升

C# 10 中的新增功能  

Net5升级Net6

Net6介绍

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注