目录
支持在 ExecuteUpdateAsync 方法中使用非表达式 Lambda
在 Visual Studio 2022 预览版中创建新的 ASP.NET Core 10 项目
支持使用 IOpenApiDocumentProvider 接口访问 OpenAPI 文档
支持使用 System.Text.Json 的 JSON Patch
支持在 Transformers 中生成 OpenAPI Schema
RedirectHttpResult.IsLocalUrl 辅助方法
Entity Framework Core (EF Core) 是微软推出的一款跨平台、轻量级、可扩展的对象关系映射器 (ORM),它简化了数据库操作。Entity Framework Core (EF Core) 10 包含多项新特性和增强功能,例如:
- LINQ 和 SQL 转换增强
- 支持 Azure Cosmos DB 上的全文搜索
- 支持混合搜索
- 支持 LeftJoin 和 RightJoin 运算符
- 在 Azure Cosmos DB 上演化模型时提供增强支持
- 增强对映射存储过程的支持
ExecuteUpdateAsync在方法中支持非表达式 lambda
上一篇:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/156082567

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
安装 Entity Framework Core
在使用 EF Core 之前,需要先通过 NuGet 将其安装到项目中。要安装使用 Entity Framework Core 和 SQL Server 所需的 NuGet 包,请将这些包安装到项目中,右键单击解决方案,然后选择“管理解决方案的 NuGet 程序包…”
窗口弹出后,搜索要添加到项目中的 NuGet 包。为此,请在 NuGet 包管理器屏幕的搜索框中输入名为 `<package_name>` Microsoft.EntityFrameworkCore, Microsoft.EntityFrameworkCore.Design、` <package_name>`Microsoft.EntityFrameworkCore.Tools,和`<package_name>` 的包Microsoft.EntityFrameworkCore.SqlServer,然后依次安装它们。
或者,您也可以在 NuGet 包管理器命令提示符下键入以下命令:
PM> Install-Package Microsoft.EntityFrameworkCore
PM> Install-Package Microsoft.EntityFrameworkCore.Design
PM> Install-Package Microsoft.EntityFrameworkCore.Tools
PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer
您也可以通过在 Windows Shell 中执行以下命令来安装这些软件包:
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.Tools
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
LINQ 和 SQL 转换增强
在 EF Core 10 中,LINQ 查询优化了执行,并最大限度地减少了冗余的数据库调用,从而改进了索引机制。查询编译器优化方面的新变化增加了 LINQ 表达式的更高效转换,从而加快了数据访问速度并改善了并发管理。
支持 Azure Cosmos DB 上的全文搜索
.NET 10 中,Azure Cosmos DB 引入了对 NoSQL 全文搜索的支持,从而实现了全面而高级的文本搜索。您可以将其与向量搜索结合使用,以提高某些 AI 用例的搜索精度。EF Core 10 对该功能的支持使得您可以对数据库进行建模,并启用全文搜索属性。
以下代码片段展示了如何在 EF Core 10 中配置全文搜索:
public class ApplicationDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext>
options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>(b =>
{
b.Property(e => e.City).EnableFullTextSearch();
b.HasIndex(e => e.City).IsFullTextIndex();
});
}
}
假设全文搜索已经配置完成,可以使用以下代码片段在 EF Core 10 中利用全文搜索功能:
var data = await context.Persons
.Where(x => EF.Functions.FullTextContains(x.City, "Texas"))
.ToListAsync();
支持混合搜索
EF Core 10 支持向量相似度搜索和全文搜索相结合的方式(即混合搜索)。以下代码片段展示了如何使用混合搜索。
float[] vectorArray;
/* Assume that the vector array is populated with vector data
derived from text, image, etc. */
var hybrid = await context
.Persons
.OrderBy(x => EF.Functions.Rrf(
EF.Functions.FullTextScore(x.City, "database"),
EF.Functions.VectorDistance(x.Vector, vectorArray)
))
.Take(25)
.ToListAsync();
支持 LeftJoin 和 RightJoin 运算符
在之前的 EF Core 版本中,在 LINQ 操作中实现 LeftJoin 操作相当具有挑战性。而从 EF Core 10 开始,现在LINQ 中同时支持LeftJoin 和 RightJoin 操作。
以下查询展示了如何在 EF Core 10 中使用 LeftJoin 运算符:
var query = context.Payroll
.LeftJoin(
context.Department,
employee => employee.DepartmentID,
department => department.ID,
(employee, department) => new
{
employee.ID,
employee.FirstName,
employee.LastName,
employee.JoiningDate,
employee.EmailAddress,
Department = department.Name ?? ""
});
在 Azure Cosmos DB 上演化模型时增强支持
在 Azure Cosmos DB 中使用 EF Core 为实体添加新的必填属性时,会出现物化问题,因为 EF 无法物化该实体。这是因为文档是在更改之前创建的,所以 EF Core 无法获取这些值。要解决此问题,请先将该属性标记为可选,手动添加默认值,然后再进行所需的更改。
增强对映射存储过程的支持
借助 EF Core 10,您可以比以往更轻松地在存储过程中映射 CUD(创建、更新、删除)操作,从而实现更高效的数据管理。在此 EF Core 版本之前,运行存储过程需要执行许多步骤,非常耗时费力。
现在,您可以启用 EF Core,使其在处理 CUD 操作时利用存储过程,而不是生成 SQL 命令。以下代码片段展示了如何实现这一点:
modelBuilder.Entity<Person>()
.InsertUsingStoredProcedure("Employee_Insert", spe =>
{
spe.HasParameter(e => e.FirstName);
spe.HasResultColumn(e => e.Id);
})
.UpdateUsingStoredProcedure("Employe_Update", spe =>
{
spe.HasOriginalValueParameter(e => e.Id);
spe.HasParameter(e => e.FirstName);
spe.HasRowsAffectedResultColumn();
})
.DeleteUsingStoredProcedure("Employe_Delete", spe =>
{
spe.HasOriginalValueParameter(e => e.Id);
spe.HasRowsAffectedResultColumn();
});
在 EF Core 中,` InsertUsingStoredProcedureinsert` 、`update` 和 `delete` 方法UpdateUsingStoredProcedure以扩展方法的形式实现,它们调用底层数据库上相应的存储过程,用于在关系数据库中插入、更新和删除数据。通常,这些扩展方法在自定义 `DbContext` 类的 `get` 方法DeleteUsingStoredProcedure中使用。OnModelCreating
支持在 ExecuteUpdateAsync 方法中使用非表达式 Lambda
在最新版本的 EF Core 中,新引入的 ` ExecuteUpdateAsyncand`ExecuteDeleteAsync方法支持异步批量更新或删除操作。这些改进显著提升了可扩展性,尤其适用于管理海量数据的云应用。
在早期版本的 EF Core 中,该ExecuteUpdateAsync方法需要表达式树,这使得动态更新难以处理。EF Core 10ExecuteUpdateAsync增强了 LINQ 查询转换和该方法,从而实现了更灵活高效的数据库操作。EF Core 10 还支持在该方法中使用正则表达式(非表达式 lambda)ExecuteUpdateAsync。
以下代码片段展示了 EF Core 10 如何支持使用正则 lambda 表达式,从而可以轻松地动态执行条件更新:
await context.Blogs.ExecuteUpdateAsync(s =>
{
if (isNameChanged)
{
s.SetProperty(a => a.FirstName, "Joydip");
s.SetProperty(a => a.LastName, "Kanjilal");
}
});
EF Core 10 中的其他一些改进包括支持一些以 char 为参数的字符串函数、支持在 SQLite 上使用 decimal 的 MAX/MIN/ORDER BY、将 COALESCE 转换为 ISNULL,以及将 AsyncLocal 替换为 ThreadId 以提高延迟加载器的性能。
安装 Entity Framework Core 10
安装使用 Entity Framework Core 和 SQL Server 所需的 NuGet 程序包。要将这些程序包安装到您的项目中,请右键单击解决方案,然后选择“管理解决方案的 NuGet 程序包…”。
现在,在搜索框中搜索名为 ` <packages_name>`Microsoft.EntityFrameworkCore和Microsoft.EntityFrameworkCore.InMemory`<packages_name>` 的 NuGet 包,并依次安装它们。选择最新的 EF Core 发布版本,如图1所示。截至撰写本文时,最新的 EF Core 发布版本为 10.0.1。

图 1: NuGet 包管理器窗口
另一种方法是在 NuGet 包管理器命令提示符下键入以下命令:
PM> Install-Package Microsoft.EntityFrameworkCore -v 10.0.1
PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer -v
10.0.1
或者,您也可以在 Windows Shell 中执行以下命令来安装这些软件包:
dotnet add package Microsoft.EntityFrameworkCore -v 10.0.1
dotnet add package Microsoft.EntityFrameworkCore.SqlServer -v 10.0.1

ASP.NET Core 10 中的新特性和增强功能
微软在 ASP.NET Core 10 中引入了 Blazor、SignalR、极简 API 和 OpenAPI 3.1 的多项增强功能。ASP.NET Core 10 承诺简化开发流程,与现代 Web 标准无缝集成,并相比之前的版本拥有更佳的性能。本节重点介绍 ASP.NET Core 10 中引入的新特性和增强功能:
- Blazor增强功能
- 将表单提交中的空字符串转换为可空值类型的 null 值
IOpenApiDocumentProvider支持使用接口访问 OpenApiDocument- 改进 ASP.NET Core OpenAPI 文档生成
- 支持使用 JSON Patch
System.Text.Json - 增强对 OpenAPI XML 文档的支持
- 支持在转换器中生成 OpenAPI 模式
- 支持 JavaScript 互操作
- 支持在最小 API 中进行验证
- 增强对服务器发送事件 (SSE) 的支持
- 支持为 API 控制器指定响应描述
- 身份验证和授权增强
- 辅助
RedirectHttpResult.IsLocalUrl方法
在深入探讨这些增强功能之前,我们先来学习如何在 Visual Studio 中创建一个新的 ASP.NET Core 10 项目。
在 Visual Studio 2022 预览版中创建新的 ASP.NET Core 10 项目
您可以通过多种方式在 Visual Studio 2022 中创建项目,例如通过 Visual Studio 2022 开发人员命令提示符或启动 Visual Studio 2022 IDE。启动 Visual Studio 2022 预览版时,您会看到“开始”窗口。您可以选择“不编写代码继续”来启动 Visual Studio 2022 预览版 IDE 的主屏幕。
现在您已经了解了基础知识,让我们开始设置项目。要在 Visual Studio 2022 中创建一个新的 ASP.NET Core 8 项目:
- 启动 Visual Studio 2022 IDE 预览版。
- 在“创建新项目”窗口中,选择ASP.NET Core Web API,然后单击“下一步”继续。
- 在“配置新项目”窗口中,指定项目名称和创建路径。
- 如果您希望解决方案文件和项目创建在同一目录下,可以选择选中“将解决方案和项目放在同一目录下”复选框。单击“下一步”继续。
- 在下一个屏幕中,从相应的下拉控件中,将目标框架指定为.NET 10.0(预览版),并将身份验证类型指定为None 。
- 请确保“配置 HTTPS”、“启用 Docker 支持”、“不使用顶级语句”和“启用 OpenAPI 支持”复选框未选中,因为在本示例中您不会使用这些复选框。
- 请记住选中“使用控制器”复选框,因为本示例中不会使用最小 API。
- 点击“创建”完成该过程。
一个新的 ASP.NET Core Web API 项目已创建。您将在后续章节中使用此项目。
Blazor增强功能
Blazor 是微软推出的开源现代 Web 框架,它使开发人员能够使用 C# 和 .NET 创建交互式 Web 应用程序。它最初包含在 .NET 5 中,用于使用 C# 和 .NET 构建交互式 Web 应用程序。
ASP.NET Core 10 Blazor 中的组件QuickGrid现在包含一个 RowClass 参数,如下面的代码片段所示:
<QuickGrid Items="employee" RowClass="ApplyRowStyle">
<PropertyColumn Property="@(e => e.EmployeeId)" Sortable="true" />
<PropertyColumn Property="@(e => e.FirstName)" Sortable="true" />
<PropertyColumn Property="@(e => e.FirstName)" Sortable="true" />
<PropertyColumn Property="@(e => p.JoiningDate)" Format="yyyy-MM-dd"
Sortable="true" />
</QuickGrid>
此外,您还可以利用该CloseColumnOptionsAsync方法关闭QuickGrid列选项 UI,如下面的代码示例所示:
<QuickGrid @ref="employeeGrid"
Items="employees">
<PropertyColumn Property="@(e => e.City)"
Title="City">
<ColumnOptions>
<input type="search"
@bind="cityFilter"
placeholder="Filter by city"
@bind:after="@(() => employeeGrid.CloseColumnOptionsAsync())" />
</ColumnOptions>
</PropertyColumn>
<PropertyColumn Property="@(e => e.FirstName)"
Title="First Name" />
<PropertyColumn Property="@(e => e.LastName)"
Title="Last Name" />
<PropertyColumn Property="@(e => e.City)"
Title="City" />
</QuickGrid>
如果您使用 EF Core 将数据绑定到 Blazor 中的 QuickGrid 组件,请添加对Microsoft.AspNetCore.Components.QuickGrid.EntityFrameworkAdapterNuGet 包的引用。BlazorQuickGrid中的该组件能够解析返回 IQueryable 数据的查询。要使用此功能,请AddQuickGridEntityFrameworkAdapter在文件中调用服务集合上的相应方法Program.cs,如下面的代码片段所示:
builder.Services.AddQuickGridEntityFrameworkAdapter();
这样,您就可以注册一个符合 EF Core 规范的 IAsyncQueryExecutor 实现。清单 2展示了如何QuickGrid在 ASP.NET Core Blazor 中使用该组件来绑定数据。
清单 2:使用 QuickGrid 进行数据绑定
@page "/examplegrid"
@using Microsoft.AspNetCore.Components.QuickGrid
<h3>Demonstrating QuickGrid in ASP.NET Core Blazor</h3>
<QuickGrid Items="@people" TGridItem="Employee">
<PropertyColumn Property="@(employee => employee.Id)" Title="ID" />
<PropertyColumn Property="@(employee => employee.FirstName)"
Title="FirstName" />
<PropertyColumn Property="@(employee => employee.LastName)" Title="LastName" />
</QuickGrid>
@code {
public List<Employee> employee = new()
{
new Employee { Id = 1, FirstName = "Steve", LastName = "Smith" },
new Employee { Id = 2, FirstName = "Rex", LastName = "Wills" },
new Employee { Id = 3, FirstName = "Michelle", LastName = "Stevens" }
};
public class Employee {
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
}
在 .NET 10 中,Blazor Web 应用程序现在使用 Link 标头自动预加载框架静态资源,从而使 Web 浏览器能够在获取和渲染初始页面之前提前加载资源。独立的 Blazor WebAssembly 应用程序模板也已更新,允许预取状态框架资源以及生成的 JavaScript 导入映射。
将表单提交中的空字符串转换为可空值类型的 Null 值
在 ASP.NET Core 10 中使用最小 API 处理属性时[Form],表单提交操作中的空字符串值会被转换为 null,如下面的代码片段所示:
using Microsoft.AspNetCore.Http;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/book",
([FromForm] Book book) => TypedResults.Ok(book));
app.Run();
public class Book
{
public int Id
{
get; set;
}
public DateOnly? PublicationDate
{
get; set;
}
public string Title
{
get; set;
}
}
请参考前面的代码片段。如果该字段为空,则其值PublicationDate将映射到null 。

支持使用 IOpenApiDocumentProvider 接口访问 OpenAPI 文档
在 .NET 10 中,ASP.NET Core 允许您使用依赖注入注入类型引用IOpenApiDocumentProvider。因此,现在可以在 HTTP 上下文之外(例如后台服务或自定义中间件)访问 OpenAPI 文档实例。以下代码片段展示了如何IOpenAPiDocumentProvider使用构造函数注入注入类型实例。
public class OrderService
(
IOpenAPiDocumentProvider openApiDocumentProvider
)
{
public async Task SomeMethod()
{
OpenApiDocument doc = await
openApiDocumentProvider.GetOpenApiDocumentAsync();
}
}
改进 ASP.NET Core OpenAPI 文档生成
ASP.NET Core 10 提供了对生成 OpenAPI 文档的支持,而 OpenAPI 文档又与 2020 年 12 月发布的 JSON Schema 草案规范保持一致。虽然这项改进使 API 文档的结构更清晰、更准确,但此版本也引入了一些变化。在 OpenAPI 3.1 中,可空属性使用`type`关键字代替了`nullable: true`。此外,虽然您仍然可以使用 OpenAPI 3.0 生成文档,但 OpenAPI 3.1 现在被视为生成文档的默认版本。
您可以使用以下代码配置 OpenAPI 版本 3.0:
builder.Services.AddOpenApi(options =>
{
options.OpenApiVersion = Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0;
});
或者,也可以使用 MSBuild 选项指定相同的内容:
<OpenApiGenerateDocumentsOptions> --openapi-version OpenApi3_0
</OpenApiGenerateDocumentsOptions>
OpenAPI 3.1 的另一个关键变化是将 `<string>` 替换OpenApiAny为 `<string> JsonNode`。请看以下代码片段,它展示了如何OpenApiObject在早期版本的 .NET Core 中生成 OpenAPI 文档时使用 `<string>`:
options.AddSchemaTransformer((schema, context, cancellationToken) =>
{
if (context.JsonTypeInfo.Type == typeof(Employee))
{
schema.Example = new OpenApiObject
{
["joiningdate"] = new OpenApiString(
DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")),
["comments"] = new OpenApiString("New Employee")
};
}
return Task.CompletedTask;
});
OpenApiObject使用 .NET 10,您可以通过替换为以下代码来编写JsonObject:
options.AddSchemaTransformer(
(schema, context, cancellationToken) =>
{
if (context.JsonTypeInfo.Type == typeof(Employee))
{
schema.Example = new JsonObject
{
["joiningdate"] = new OpenApiString(
DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")),
["comments"] = new OpenApiString("New Employee"),
};
}
return Task.CompletedTask;
});
要使用此功能,请记住在项目文件中启用 XML 文档生成。以下代码片段展示了如何实现此操作:
<PropertyGroup>
<GenerateDocumentationFile>
true
</GenerateDocumentationFile>
</PropertyGroup>
ASP.NET Core 10 的另一个有趣特性是支持以 YAML 格式生成 OpenAPI 文档。要在Program.cs文件中配置此功能,请使用以下代码片段:
app.MapOpenApi("/openapi/{documentName}.yaml");
在 ASP.NET Core 10 中,ASP.NET Core Web API (Native AOT) 项目模板默认支持使用该Microsoft.AspNetCore.OpenApi包生成 OpenAPI 文档。要关闭此功能,请使用--no-openapi相应的标志。

支持使用 System.Text.Json 的 JSON Patch
JSON Patch 已被公认为修改 JSON 文档的标准方法。它封装了一系列可用于更改 JSON 文档的操作(添加、删除、替换、移动、复制、测试)。在 Web 应用程序中,JSON Patch 通常用于 PATCH 操作,以对资源进行部分属性更新。为了减小有效负载大小并提高性能,客户端可以发送仅包含修改内容的 JSON Patch 文档,而不是发送完整的资源对象。
Microsoft.AspNetCore.JsonPatch.SystemTextJson您可以通过在项目中安装 NuGet 包来启用 System.Text.Json 的 JSON Patch 支持。JsonPatchDocument<T>该包对应的类可用于表示类型为 T 的实例的 JSON Patch 文档。
让我们通过一个代码示例来理解这一点。请看以下代码片段,它展示了如何Author定义一个对象:
var author = new Author
{
FirstName = "Joydip",
LastName = "Kanjilal",
Address = "Hyderabad, India",
Email = "jkanjilal@gmail.com"
};
一个典型的 JSON Patch 文档如下所示:
string jsonPatch = """
[
{ "op": "replace", "path": "/Address", "value": "Hyderabad" }
]""";
接下来,反序列化 JSON 补丁文档,如下面的代码片段所示:
var deserializedDocument =
JsonSerializer.Deserialize<JsonPatchDocument<Author>>(jsonPatch);
最后,应用如下代码片段所示的 JSON 补丁文档:
deserializedDocument!.ApplyTo(author);
增强对 OpenAPI XML 文档的支持
.NET 10 中,ASP.NET Core 增强了对 OpenAPI XML 文档注释的支持。现在可以配置 XML 文档处理,以处理当前程序集之外的文档类型。
以下代码片段演示了如何在 Microsoft.AspNetCore.Http 程序集中为类型添加 XML 注释:
<Target Name="AddOpenApiDependencies" AfterTargets="ResolveReferences">
<ItemGroup>
<!-- Write your XML documentation here -->
<AdditionalFiles
Include="@(ReferencePath->'%(RootDir)%(Directory)%(Filename).xml')"
Condition="'%(ReferencePath.Filename)' ==
'Microsoft.AspNetCore.Http.Abstractions'"
KeepMetadata="Identity;HintPath" />
</ItemGroup>
</Target>
支持在 Transformers 中生成 OpenAPI Schema
借助 .NET 10,您可以为 C# 类型创建架构并将其包含在 OpenAPI 文档中。这样,您就可以在 OpenAPI 文档的任何位置引用该架构。文档、操作和架构转换器的上下文现在都包含该GetOrCreateSchemaAsync方法。
您可以使用此方法为给定类型创建模式。它还提供了一个可选ApiParameterDescription参数,用于向创建的模式添加详细信息。要在文档、操作或模式转换器中使用此功能,只需使用此GetOrCreateSchemaAsync方法生成模式,然后通过调用相应的方法将其包含在 OpenAPI 文档中即可AddComponent。以下代码片段演示了如何实现此操作:
builder.Services.AddOpenApi(options =>
{
options.AddDocumentTransformer((document, context, cancellationToken) =>
{
document.Info = new()
{
Title = "Order Processing API",
Version = "v1.0",
Description = "API for processing orders."
};
return Task.CompletedTask;
});
});
支持 JavaScript 互操作以调用构造函数和属性
借助 .NET 10,您可以利用新增的 `IJSRuntime` InvokeNewAsync、GetValueAsync`IJSObjectReference` 和 ` SetValueAsyncIJSObjectReference` 方法,从 .NET Core 应用程序调用 JavaScript 构造函数和属性。新增的接口包括用于异步调用的 `IJSRuntime` 和 `IJSObjectReference`,以及IJSInProcessRuntime用于IJSInProcessObjectReference同步调用的 `IJSRuntime` 和 `IJSObjectReference` 接口。
下面的代码片段展示了如何创建一个 JavaScript 类的实例,然后使用该实例调用其属性和方法:
window.MyClass = class {
constructor(text) {
this.text = text;
}
getLength() {
return this.text.length;
}
}
var obj = await JSRuntime.InvokeNewAsync("jsInterop.MyClass",
"Calling a JavaScript method from Blazor");
var text = await obj.GetValueAsync<string>("text");
var length = await obj.InvokeAsync<int>("getLength");
对最小 API 中验证的支持
在之前的 ASP.NET Core 版本中,不支持专门的验证 API。而 ASP.NET Core 10 则允许您验证发送到最小 API 端点的数据。此功能使运行时能够自动验证查询参数、标头信息和请求正文。您现在可以使用 DataAnnotations 属性或自定义验证逻辑来定义验证规则。
我经常使用数据注解属性来修饰业务模型类型,例如类、结构体或记录类型。请参考以下代码片段,了解如何利用这些属性来实现验证逻辑:
public class Employee
{
[Required]
[StringLength(50)]
public string FirstName;
[Required]
[StringLength(50)]
public string LastName;
}
您可以使用特性为最小 API 端点定义所需的验证。在 ASP.NET Core 10 中,您可以通过两种方式在最小 API 中实现验证:创建自定义验证器,或者IValidatableObject在验证逻辑复杂时实现接口。要在最小 API 中添加验证支持,您应该AddValidation在文件中调用扩展方法Program.cs,如下面的代码片段所示:
builder.Services.AddValidation();
以下代码片段展示了如何在HttpPOST最小 API 的方法中验证模型对象:
app.MapPost("/create", ([FromBody] Employee employee)
{
// Write your custom code
// to validate the employee object
return Results.Ok(employee);
});
您还可以通过扩展AbstractValidator类来实现自定义验证器,如下所示:
public class EmployeeValidator : AbstractValidator<Employee>
{
public EmployeeValidator()
{
RuleFor(e => e.Code).MaximumLength(5);
RuleFor(e => e.FirstName).NotNull();
RuleFor(e => e.LastName).NotNull();
}
}
以下代码片段展示了如何在最小 API 中使用自定义验证器:
app.MapPost("/create", async ([FromBody] Employee employee,
[FromServices] IValidator<Employee> validator) =>
{
var validationResult = await validator.ValidateAsync(employee);
if (!validationResult.IsValid)
{
return Results.BadRequest(validationResult.Errors);
}
// Validation is successful,
// so proceed as usual
});
现在,您可以利用最小化 API 中的验证功能,验证查询、标头和请求正文中定义的数据。要禁用特定最小化 API 端点的验证,请使用DisableValidation扩展方法,如下面的代码片段所示:
app.MapPost("/addemployee", async (Employee employee)
{
// Process request without
// validation of the model
return Results.Ok(
new
{
message = "Received with validation disabled.", employee
}
);
}).DisableValidation();
与类类型类似,.NET 10 也允许您在最小 API 中验证记录类型参数。
增强对服务器发送事件 (SSE) 的支持
使用 ASP.NET Core 10,您可以利用TypedResults.ServerSentEventsAPI 返回 ServerSentEvents 结果。以下代码片段演示了如何实现这一点:
app.MapGet("/getall", (CancellationToken cancellationToken) =>
{
return TypedResults.ServerSentEvents(GetAllEmployee(
cancellationToken), eventType: "getAll");
});
此功能适用于 ASP.NET Core 10 中的最小 API 和基于控制器的 API。
支持为 API 控制器指定响应描述
在 ASP.NET Core 10 中,`getResponse`、`getResponseBody`ProducesAttribute和ProducesResponseTypeAttribute` ProducesDefaultResponseTypegetResponseCreative` 属性现在接受一个名为 `responseDescription` 的可选字符串参数Description。使用该参数可以指定响应的描述,如下面的代码片段所示:
[HttpGet(Name = "GetAllEmployee")]
[ProducesResponseType<IEnumerable<Employee>>(StatusCodes.Status200OK,
Description = "This endpoint returns all employee records.")]
public IEnumerable<Employee> GetAllEmployee()
{
// Write your code here to
// return all employee records
}
身份验证和授权增强功能
ASP.NET Core 10 新增了对更多指标的支持。这将有助于获取此处列出的每个事件的指标。
验证:
- 请求持续时间
- 挑战计数
- 禁止计数
- 登录人数
- 签出计数
授权:
- 需要授权的请求数量
RedirectHttpResult.IsLocalUrl 辅助方法
使用 ASP.NET Core 10,您可以使用辅助方法确定 URL 是否为本地 URL RedirectHttpResult.IsLocalUrl(url),如下面的代码片段所示:
if (RedirectHttpResult.IsLocalUrl(url))
{
return Results.LocalRedirect(url);
}
WPF 10 的新特性
Windows Presentation Foundation (WPF) 是由微软开发的一个灵活的用户界面框架,最初包含在 .NET Framework 3.0 中。WPF 10 进行了多项增强和错误修复,主要侧重于提升性能和流畅样式支持。在此版本中,Label、Hyperlink、GroupBox、GridSplitter 和 NavigationWindow 等控件都添加了流畅样式。
通过优化缓存操作、将字体集合加载器移至托管代码以及改进数组处理,性能得到了提升。此外,还修复了一些错误并进行了其他一些更改,这些更改可以增强框架的功能并改善开发者体验。
Windows Forms 10 的新功能
.NET 10 中的 Windows Forms(也称为 WinForms)进行了多项增强,旨在提高开发人员的工作效率、改进设计体验并增强互操作性。WinForms 和 Windows Presentation Foundation (WPF) 现在共享一个通用的剪贴板实现,从而简化了两个框架之间的数据交换。此外,还进行了多项改进,以提高与 NVDA 等屏幕阅读器的兼容性。
为了增强基于 JSON 的序列化性能并逐步淘汰过时的 BinaryFormatter,我们新增了多种方法。这些改进提升了安全性,使 Windows Forms 应用程序更加现代化,并符合微软提高安全性和可维护性的目标。
摘要
.NET 10 旨在提升稳定性、速度,并降低 C# 日益丰富的高级特性所带来的抽象开销。大量新特性和增强功能的引入,使 C# 成为一种更具表现力、更灵活、更高效的编程语言。此外,.NET 10 是一个长期支持版本,对运行时、语言特性和类库都进行了重大改进,并提供长达三年的支持。
虽然引入这些新功能和改进将有助于企业和开发者构建灵活、易于管理且高效的应用程序,但在选择特定功能之前,您必须考虑其性能、可扩展性和安全性优势。最佳的入门方法是分析各项功能,进行性能基准测试,然后根据实际情况将其应用到您的应用程序中。
基准测试
基准测试是指将代码片段的性能与预定义的基准进行比较,从而帮助您了解应用程序方法的性能指标。BenchmarkDotNet 是最流行的基准测试工具之一。它是一个适用于 .NET Framework 和 .NET Core 应用程序的开源库,可以将 .NET 方法转换为基准测试。借助 BenchmarkDotNet,您可以自动将 .NET 方法转换为基准测试,跟踪其性能并分析收集到的性能数据。
上一篇:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/156082567
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
1122

被折叠的 条评论
为什么被折叠?



