.NET 6的亮点

164 阅读7分钟

随着.NET 6的发布,微软巩固了其创建一个统一平台的计划,以便为任何设备和操作系统开发应用程序。与这一愿景一起,.NET 6带来了许多新的功能,旨在简化开发和获得性能。让我们快速浏览一下主要内容。

统一平台支持

为.NET世界提供统一平台的愿景始于.NET 5。该版本旨在成为各种.NET风格的统一继承者:.NET框架、.NET标准、.NET核心、Mono等。除了这个目标,.NET 5还希望成为一个开发平台,为任何平台创建任何类型的应用程序。然而,当时还缺少一块重要的拼图:一个统一的框架来创建跨平台的UI。现在,有了.NET MAUI,即**.NET多平台应用UI**框架,这个拼图就完整了。尽管在写这篇文章的时候,.NET MAUI还处于预览阶段,但它已经成熟到可以被视为.NET 6版本的一部分。

现在有了.NET 6,你真的可以创建你想要的应用程序,并几乎可以在任何地方运行它:从桌面到移动,从网络到云。

.NET 6 unified platform

[资源。微软]

特别是,新的.NET MAUI框架允许你用一个代码库建立桌面和移动的本地用户界面。

.NET MAUI overview

简化开发

.NET 6版本的主要目标之一是为开发者提供简化工作的功能。你可以在整个平台上找到对简化开发的支持,但有三个方面确实令人振奋:新的C#功能、热重载支持和最小的网络API。

C# 10的特点

.NET 6为你带来了C# 10的大量新功能,帮助你更容易地编写代码。让我们快速浏览一下其中的几个。

全局和隐式使用

作为一个C#开发者,你知道在你项目的每个文件中声明相同的命名空间是多么令人厌烦。例如,考虑一下System 命名空间。它的使用非常普遍,我敢肯定你经常忘记它,让Visual Studio提示它。

现在你可以使用一个全局using ,来声明命名空间,如下例所示。

global using System;

有了这个声明,你就不需要在所有文件中插入 using System;声明,你不再需要在所有文件中插入。你可以在任何文件中通过global using ,声明一个命名空间,它将在整个项目中可用。

如果你愿意(而且我认为这是一个好的做法),你可以在一个名为 GlobalUsings.cs.

你也可以利用隐式using,通过配置 <ImplicitUsings>元素来利用隐含的。 .csproj文件,如下图所示。

<PropertyGroup>
    <!-- ...existing properties... -->
    <ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

这样,编译器会根据你项目的类型自动添加所需的global using 指令。

新的命名空间语法

你知道,声明命名空间的通常方式如下。

namespace Geometry
{
  class Triangle 
  {
    // ...class members...
  }
}

现在你可以使用文件范围的命名空间语法来获得同样的结果。

namespace Geometry

class Triangle 
{
  // ...class members...
}

使用这种方法,你在当前文件中定义的所有内容都属于声明的命名空间。通过删除一个嵌套层,你使代码变得更干净。然而,你不能用这种新的语法创建嵌套的命名空间。

lambda表达式的自然类型

考虑以下将λ表达式赋值给一个变量的情况。

Func<string, int> parse = (string s) => int.Parse(s);

你需要声明lambda表达式的目标类型。 Func<string, int>在这个例子中。从C#10开始,你可以把上述代码写成如下。

var parse = (string s) => int.Parse(s);

编译器将尝试推断λ表达式的 "自然 "类型。

热重新加载

为了提高开发人员的工作效率,.NET 6将热重载功能扩展到Visual Studio和几乎所有类型的项目。它允许你在开发环境中运行一个应用程序,进行修改,并在不停止、重建和重新运行应用程序的情况下应用这些修改。

在以前的.NET版本中,这个功能只在.NET CLI中通过dotnet watch 命令提供。现在你只需点击一个按钮,就可以在Visual Studio 2022中受益。

Visual Studio 2022 Hot Reload button

[来源。微软]

最小的网络API

.NET 6为简化你的代码而引入的一个惊人的功能是最小的网络API。沿着顶层语句的思路,现在你可以用几行代码建立一个完全工作的网络API应用程序。考虑一下下面这个例子。

//Program.cs
var app = WebApplication.CreateBuilder(args).Build();

app.MapGet("/", () => "Hello World!");
app.Run();

这是你运行一个简单的*Hello World!*网络API所需的所有代码。

如果你有一些用ASP.NET Core构建网络API的经验,你知道你通常需要一个更明确的项目。你至少需要一个 Program.cs文件,其中包含应用程序的设置代码,一个 Startup.cs文件来配置你的API,以及一个定义API路由和实现端点的控制器类。

这是很好的简化!

性能的改进

在过去的几年里,.NET团队投入了大量的精力来提高平台在编译和执行时间上的性能,并减少内存消耗。通过.NET 6,你可以在框架的许多部分欣赏到这些改进。例如,在构建.NET项目时,为提高内循环性能所做的努力已经取得了令人敬畏的成果,你可以从下图中看到这一点。

dotnet6-build-improvements

[源于此。微软]

其他的性能改进包括IO子系统。例如,FileStream几乎被完全重写,即使相对于.NET 5,也取得了惊人的成果,如下表对写入操作的总结。

FileStream performance improvement

[资料来源:微软。微软]

你可以查看关于.NET 6的性能改进的详细报告和相关的基准测试,以了解更多信息。

总结

对.NET 6的快速概述表明,这是.NET平台的一个整合版本。它旨在完成从.NET 5开始的统一平台愿景,改善平台的内部结构以提供最好的性能,并开始了一个开发简化的过程,在未来的版本中可能会进一步简化。

除此以外。用Auth0保证ASP.NET Core的安全

用Auth0保证ASP.NET Core应用程序的安全是很容易的,并带来了很多伟大的功能。有了Auth0,你只需要写几行代码就可以得到一个坚实的身份管理解决方案单点登录、对社会身份提供者(如Facebook、GitHub、Twitter等)的支持,以及对企业身份提供者(如活动目录、LDAP、SAML、自定义等)的支持。

在ASP.NET Core上,你需要在你的Auth0管理仪表板上创建一个API,并在你的代码上改变一些东西。要创建一个API,你需要注册一个免费的Auth0账户。之后,你需要进入仪表板的API部分,点击 "创建API"。在显示的对话框中,你可以将你的API的名称设置为 "书籍",标识符"http://books.mycompany.com",并将签名算法设为 "RS256"。

Creating API on Auth0

之后,你必须将对 services.AddAuthentication()方法中的 ConfigureServices()``Startup 的方法,如下所示。

string authority = $"https://{Configuration["Auth0:Domain"]}/";
string audience = Configuration["Auth0:Audience"];

services.AddAuthentication(options =>
{
  options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
  options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
  options.Authority = authority;
  options.Audience = audience;
});

Configure()``Startup 方法的主体中,你还需要添加一个调用到 app.UseAuthentication()app.UseAuthorization()如下图所示。

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});

请确保你按照上面的顺序调用这些方法。这是至关重要的,这样一切才能正常工作。

最后,将以下元素添加到 appsettings.json配置文件。

{
  "Logging": {
    // ...
  },
  "Auth0": {
    "Domain": "YOUR_DOMAIN",
    "Audience": "YOUR_AUDIENCE"
  }
}

:替换占位符 YOUR_DOMAINYOUR_AUDIENCE替换为你在创建Auth0账户时指定的域名和你分配给你的API的标识符的实际值。