Entity Framework Core (EF Core) 10 的新特性

目录

安装 Entity Framework Core

LINQ 和 SQL 转换增强

支持 Azure Cosmos DB 上的全文搜索

支持混合搜索

支持 LeftJoin 和 RightJoin 运算符

在 Azure Cosmos DB 上演化模型时增强支持

增强对映射存储过程的支持

支持在 ExecuteUpdateAsync 方法中使用非表达式 Lambda

安装 Entity Framework Core 10

ASP.NET Core 10 中的新特性和增强功能

在 Visual Studio 2022 预览版中创建新的 ASP.NET Core 10 项目

Blazor增强功能

将表单提交中的空字符串转换为可空值类型的 Null 值

支持使用 IOpenApiDocumentProvider 接口访问 OpenAPI 文档

改进 ASP.NET Core OpenAPI 文档生成

支持使用 System.Text.Json 的 JSON Patch

增强对 OpenAPI XML 文档的支持

支持在 Transformers 中生成 OpenAPI Schema

支持 JavaScript 互操作以调用构造函数和属性

对最小 API 中验证的支持

增强对服务器发送事件 (SSE) 的支持

支持为 API 控制器指定响应描述

身份验证和授权增强功能

RedirectHttpResult.IsLocalUrl 辅助方法

WPF 10 的新特性

Windows Forms 10 的新功能

摘要

基准测试


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.EntityFrameworkCoreMicrosoft.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 PatchSystem.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 项目:

  1. 启动 Visual Studio 2022 IDE 预览版。
  2. 在“创建新项目”窗口中,选择ASP.NET Core Web API,然后单击“下一步”继续。
  3. 在“配置新项目”窗口中,指定项目名称和创建路径。
  4. 如果您希望解决方案文件和项目创建在同一目录下,可以选择选中“将解决方案和项目放在同一目录下”复选框。单击“下一步”继续。
  5. 在下一个屏幕中,从相应的下拉控件中,将目标框架指定为.NET 10.0(预览版),并将身份验证类型指定为None 。
  6. 请确保“配置 HTTPS”、“启用 Docker 支持”、“不使用顶级语句”和“启用 OpenAPI 支持”复选框未选中,因为在本示例中您不会使用这些复选框。
  7. 请记住选中“使用控制器”复选框,因为本示例中不会使用最小 API。
  8. 点击“创建”完成该过程。

一个新的 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` InvokeNewAsyncGetValueAsync`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`ProducesAttributeProducesResponseTypeAttributeProducesDefaultResponseTypegetResponseCreative` 属性现在接受一个名为 `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

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

内容概要:本文详细介绍了一个基于C++的养老院管理系统的设计与实现,旨在应对人口老龄化带来的管理挑战。系统通过整合住户档案、健康监测、护理计划、任务调度等核心功能,构建了从数据采集、清洗、AI风险预测到服务调度与可视化的完整技术架构。采用C++高性能服务端结合消息队列、规则引擎和机器学习模型,实现了健康状态实时监控、智能任务分配、异常告警推送等功能,并解决了多源数据整合、权限安全、老旧硬件兼容等实际问题。系统支持模块化扩展与流程自定义,提升了养老服务效率、医护协同水平和住户安全保障,同时为运营决策提供数据支持。文中还提供了关键模块的代码示例,如健康指数算法、任务调度器和日志记录组件。; 适合人群:具备C++编程基础,从事软件开发或系统设计工作1-3年的研发人员,尤其是关注智慧养老、医疗信息系统开发的技术人员。; 使用场景及目标:①学习如何在真实项目中应用C++构建高性能、可扩展的管理系统;②掌握多源数据整合、实时健康监控、任务调度与权限控制等复杂业务的技术实现方案;③了解AI模型在养老场景中的落地方式及系统架构设计思路。; 阅读建议:此资源不仅包含系统架构与模型描述,还附有核心代码片段,建议结合整体设计逻辑深入理解各模块之间的协同机制,并可通过重构或扩展代码来加深对系统工程实践的掌握。
内容概要:本文详细介绍了一个基于C++的城市交通流量数据可视化分析系统的设计与实现。系统涵盖数据采集与预处理、存储与管理、分析建模、可视化展示、系统集成扩展以及数据安全与隐私保护六大核心模块。通过多源异构数据融合、高效存储检索、实时处理分析、高交互性可视化界面及模块化架构设计,实现了对城市交通流量的实时监控、历史趋势分析与智能决策支持。文中还提供了关键模块的C++代码示例,如数据采集、清洗、CSV读写、流量统计、异常检测及基于SFML的柱状图绘制,增强了系统的可实现性与实用性。; 适合人群:具备C++编程基础,熟悉数据结构与算法,有一定项目开发经验的高校学生、研究人员及从事智能交通系统开发的工程师;适合对大数据处理、可视化技术和智慧城市应用感兴趣的技术人员。; 使用场景及目标:①应用于城市交通管理部门,实现交通流量实时监测与拥堵预警;②为市民出行提供路径优化建议;③支持交通政策制定与信号灯配时优化;④作为智慧城市建设中的智能交通子系统,实现与其他城市系统的数据协同。; 阅读建议:建议结合文中代码示例搭建开发环境进行实践,重点关注多线程数据采集、异常检测算法与可视化实现细节;可进一步扩展机器学习模型用于流量预测,并集成真实交通数据源进行系统验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hefeng_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值