.NET 5 中有哪些新功能?了解 .NET Core 和 .NET Framework 如何演变为新的跨平台框架,下面为你介绍.NET 5的5个新功能。
.NET 5功能介绍:.NET 5 是 .NET Core 3.1 和 .NET Framework 4.8 的继任者,旨在为 .NET 开发人员提供全新的跨平台开发体验。它整理了多年来出现的 .NET 世界碎片化并带来了新的惊人功能。当然,你现在无法全面了解 .NET 5,但你可以只关注五件事,以清楚了解正在发生的事情。
.NET 5新功能:统一平台
你必须知道的第一件事是 .NET 5 为你带来了 .NET 世界的全新统一愿景。
如果你一直在使用 .NET,你可能会注意到自 2002 年首次发布以来它的平台碎片化。.NET Framework 最初是为 Windows 设计的,但它的运行时规范,也称为公共语言基础结构 (CLI),标准化为ECMA 335。
标准化允许任何人创建自己的 .NET 运行时实现。事实上,其中一些已经出现:用于基于 Linux 的系统的Mono,用于基于浏览器的应用程序的Silverlight,. NET Compact和Micro框架用于移动设备和资源受限设备等。然后,Microsoft 决定从头开始编写 .NET Core,并考虑到跨平台兼容性。
这些不同的实现提出了了解 .NET 包可以在何处运行的需求。你应该构建不同版本的库来分发它吗?这个问题的答案是.NET Standard,即你应该期望跨 CLI 实现的通用 API 的正式规范。换句话说,如果你为一个特定的 .NET Standard 构建你的库,你将保证它会在实现该规范的所有运行时上运行。
你明白,在这种混乱的情况下,想要的交叉实现兼容性并不是那么容易实现的。这就是 .NET 5 出现的原因。
[来源:微软]
新的 .NET 平台是各种 .NET 风格的统一继承者:.NET Framework、.NET Standard、.NET Core、Mono 等。它正式成为 .NET Core 3.1 的下一个版本,但基本上决定了.NET Framework、.NET Standard 和其他让 .NET 开发人员头疼的变体。
.NET 5新功能:.NET 5 提供了一组通用的 API,用于对齐不同的运行时实现。这组 API 由目标框架名称(TFM)标识,它是你在 .NET 项目中设置的用于指定目标框架的标记。这使你的应用程序能够在支持 .NET 5 的任何运行时实现上运行。但是,你仍然可以为特定平台构建应用程序。例如,要构建使用 Windows API 的应用程序,你需要指定TFM。这样,构建特定于平台的应用程序是你的选择,而不是取决于你用来开发应用程序的运行时实现的选择。net5.0
net5.0-windows
当然,实现这个统一的平台需要付出巨大的努力和内部架构的重新安排。正如你稍后将看到的那样,一些功能已从核心 API 集中删除,但该平台在性能方面获得了普遍改进。
虽然新的 .NET 5 带有平台统一目标,但由于 COVID-19,最初的计划发生了变化。事实上,.NET 5 为统一奠定了基础,但它将在 2021 年 11 月与 .NET 6 一起完成。随着该版本的发布,你将获得新通用 UI 的稳定版本以及对 Android 特定 TFM 的支持() 和 iOS ( ),例如。net6.0-android
net6.0-ios
.NET 5的5个新功能:C# 中的新特性
.NET 5 中有哪些新功能?你应该了解的第二件事是关于 C#。.NET 5 随附 C# 9,这是 .NET 平台主要编程语言的新版本。有几个新功能,但在这里你会发现最相关的功能。
顶级语句
在新特性中,最引人注目的就是引入了顶级语句。要了解它们是什么,请查看以下经典的最小程序:
using System;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
只需要将一个字符串写入控制台,你就需要定义一个命名空间、一个类和静态方法。现在,你可以摆脱此代码基础结构,只需编写以下内容:Main()
System.Console.WriteLine("Hello World!");
顶级语句使你可以专注于小型控制台程序和实用程序中真正重要的内容,并以更面向脚本的方法使用 C#。
记录类型
另一个有趣的新功能是记录类型。使用记录,你可以声明一个不可变的引用类型,即创建后无法更改的基于类的类型。内置不可变引用类型的一个例子是类。创建 a 的实例后,你将无法再更改其值。System.String
System.String
考虑以下记录类型声明:
public record Person
{
public string FirstName { get; }
public string LastName { get; }
public Person(string first, string last) => (FirstName, LastName) = (first, last);
}
你可以Person
像使用类一样创建记录的实例,但不能更改其FirstName
属性:
var person = new Person("John", "Doe");
person.FirstName = "Jack"; //throws an error
但是,你可以与Person
原始值类似地比较记录的两个实例:
var person = new Person("John", "Doe");
var anotherPerson = new Person("John", "Smith");
Console.WriteLine(person == anotherPerson); //false
.NET 5功能介绍:初始化设置器
C# 9 还添加了init
访问器来定义只能初始化的属性。为了更好地解释其用例,请考虑以下类定义:
public class Person {
public string FirstName { get; init; }
public string LastName { get; init; }
public string Address { get; set; }
}
此类定义了可以初始化但不能更改的人员LastName
和FirstName
属性。该Address
属性可以随时更改:
var person = new Person {
FirstName = "John",
LastName = "Doe",
Address = "124 Conch Street, Bikini Bottom, Pacific Ocean"
}
person.Address = "17 Cherry Tree Lane";
person.FirstName = "Jack"; //throws error
如果你想了解更多关于 C# 9 带来的特性,请查看官方文档。
.NET MAUI,通用用户界面 - .NET 5新功能
作为第三件事,你必须知道 .NET 5 为你带来了一种构建跨平台用户界面的新方法。多亏了.NET 多平台应用程序 UI框架,也称为.NET MAUI),你将能够使用单个项目为 Android、iOS、macOS 和 Windows 构建用户界面。
实际上,此功能仍在进行中,将随 .NET 6 一起发布,但你可以开始查看 .NET MAUI,以便在正式发布时做好准备。查看路线图以了解其进展。
.NET MAUI 可以被视为Xamarin.Forms的演变,Xamarin.Forms是用于使用单个 .NET 代码库构建 iOS 和 Android 应用程序的开源框架。但是这个新框架提出了一种在移动和桌面平台上构建 UI 的通用模型。
[来源:微软]
除了众所周知的模型-视图-视图模型(MVVM) 模式之外,.NET MAUI 还支持新的模型-视图-更新(MVU) 模式。这是一种受Elm 编程语言架构启发的单向数据流模式,它提供了一种管理 UI 更新和应用程序状态的有效方法。
.NET 5的5个新功能:支持单文件应用程序
.NET 5 中有哪些新功能?你将在 .NET 5 中获得的第四件事是对单文件应用程序的支持,即将应用程序发布和部署为单个文件。这意味着你的应用程序及其所有依赖项都捆绑到一个文件中。例如,假设你在 .NET 5 项目的文件夹中运行以下命令:
dotnet publish -r linux-x64 --self-contained true /p:PublishSingleFile=true
你将获得一个包含为 Linux 构建的应用程序、你在项目中使用的所有依赖项以及 .NET 运行时 ( )的单个文件。这意味着你甚至不需要在目标机器上安装 .NET 运行时。--self-contained true
当然,你也可以在你的项目配置中指定这些参数:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<!-- Enable single file -->
<PublishSingleFile>true</PublishSingleFile>
<!-- Determine self-contained or framework-dependent -->
<SelfContained>true</SelfContained>
<!-- The OS and CPU type you are targeting -->
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
</PropertyGroup>
</Project>
请注意,此功能与你可以在 .NET Core 3.1 中构建的单文件应用程序使用的方法不同。在 .NET Core 3.1 中,单文件应用程序只是打包二进制文件的一种方式。在运行时,它们被解包到一个临时文件夹,加载并执行。在 .NET 5 中,单文件应用程序具有新的内部结构,可以直接执行而不会降低性能。
查看文档以了解有关此部署类型的更多信息。
不再支持的技术
你正在了解的有关 .NET 5 的五件事中的最后一件涉及不再支持的内容。如上所述,架构审查和使 .NET 5 成为实际跨平台编程框架的尝试导致删除了 .NET Framework 中支持的一些功能。让我们快速浏览一下已删除的功能和可能的替代方案。
网页表格
长期以来,ASP.NET Web 窗体一直是构建动态 Web UI 的主要技术。然而,它的生命周期与 .NET Framework 的命运密切相关,这并不是什么秘密。.NET Core 不支持 Web 窗体,因此 .NET 5 不再支持它的事实实际上不应成为新闻。
但是,你有几种替代方法来构建 Web UI。如果你正在构建传统的 Web 应用程序,Razor Pages是这些替代方案之一。如果要构建单页应用程序,可以使用Blazor。
.NET 5新功能:Windows 通信基础 (WCF)
甚至WCF,Windows 的传统通信框架,也将被弃用。对于使用它来构建面向服务的应用程序的开发人员来说,这似乎有点令人震惊。但是,如果你意识到 .NET 5 的主要目标是成为一个跨平台框架,那就很容易理解了。
Microsoft 推荐的 WCF 的替代方案是迁移到gRPC。但是如果你对 WCF 怀旧,或者想准备一个平滑的过渡,你可以试试 CoreWCF开源项目。
Windows 工作流基础
最后,.NET 5 甚至不会包括Windows Workflow Foundation,这是 .NET Framework 中可用的工作流引擎技术。这项技术没有官方替代品。但是,你可以使用开源移植项目CoreWF来尝试在 .NET 5 上移动现有工作流或创建新工作流。
.NET 5的5个新功能概括
.NET 5功能介绍:在本文的结尾,你对 .NET 5 将如何影响你现有的 .NET 项目以及新平台将为你提供哪些机会有了大致的了解。也许这五个突出显示的东西可能看起来像小东西,但它们应该能让你找到解决 .NET 演变中的这个转折点的方法。
.NET 5 中有哪些新功能?当然,你现在可以通过下载其运行时和 SDK来试用 .NET 5。
虽然 .NET 5 已发布,但许多需要安全性的应用程序依赖于旧版本的 .NET。以下是如何使用 Auth0保护ASP.NET Core 3.x。同样的模式应该适用于 .NET 5。如果你遇到任何困难,请在评论中告诉我们。
.NET 5新功能扩展:使用 Auth0 保护 ASP.NET Core
使用 Auth0 保护 ASP.NET Core 应用程序很容易,并带来了许多很棒的功能。使用Auth0,你只需编写几行代码即可获得可靠的身份管理解决方案、单点登录、对社交身份提供商(如 Facebook、GitHub、Twitter 等)的支持以及对企业身份提供商的支持(像 Active Directory、LDAP、SAML、自定义等)。
在 ASP.NET Core 上,你需要在 Auth0 管理仪表板中创建 API并更改代码中的一些内容。要创建 API,你需要注册一个免费的 Auth0 帐户。之后,你需要转到仪表板的 API 部分,然后单击“创建 API”。在显示的对话框中,你可以将API的名称设置为“Books”,将标识符设置为“ 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的标识符。