随着.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 MAUI框架允许你用一个代码库建立桌面和移动的本地用户界面。

简化开发
.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中受益。

[来源。微软]
最小的网络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项目时,为提高内循环性能所做的努力已经取得了令人敬畏的成果,你可以从下图中看到这一点。

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

你可以查看关于.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"。

之后,你必须将对 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_DOMAIN和YOUR_AUDIENCE替换为你在创建Auth0账户时指定的域名和你分配给你的API的标识符的实际值。