ASP.NET Core 6 中的 AddEndpointsApiExplorer 是什么

What is AddEndpointsApiExplorer in ASP.NET Core 6

我正在将 ASP.NET 核心 API 项目从 v5 升级到 v6。

v5 中的服务配置:

services.AddSwaggerGen();

v6 中的服务配置:

builder.Services.AddEndpointsApiExplorer();    // what is this?
builder.Services.AddSwaggerGen();

什么是AddEndpointsApiExplorer?无论我添加与否,一切都按预期工作。

我使用“ASP.NET API 版本控制”library。他们有关系吗?如果是这样,我必须同时使用两者,只使用库,还是现在不需要库?

TLDR; .AddEndpointsApiExplorer() 的创建是为了支持 Minimal Api's

通过 google 搜索文档显示了一些包含对 .AddEndpointsApiExplorer() 的调用的页面。但是没有提到为什么需要它,或者在从 v5 项目迁移时是否需要它。确实缺少文档。

从源代码向后工作 & git blame,我找到了相关项目。所以答案似乎与支持 Minimal Api's.

有关

我相信一些新服务的创建是为了从这些新的最小 api 中提取 return 类型信息,在不使用 MVC 的情况下使用端点路由时可能会以更通用的方式应用.

如果您正在使用 MVC,也许会通过 .AddControllers().AddApiExplorer() 为您调用。提供 swagger 依赖于描述控制器操作的服务。如果这就是您所需要的,那么似乎不需要这个新的 api 调用。

虽然使用 swagger 和最小 api 的文档包括对 .AddEndpointsApiExplorer() 的调用。即使这样也不能准确解释为什么需要它。

为什么 .AddEndpointsApiExplorer() 存在?为什么新功能被排除在 .AddApiExplorer() 之外?为什么此方法重命名被排除在 v6 的其他文档之外?

也许我们应该在 https://github.com/dotnet/aspnetcore/ or https://github.com/dotnet/AspNetCore.Docs/ 上创建一个问题来要求澄清,这样其他人就不必问这些问题了。

AddEndpointsApiExplorer 用于 Minimal APIsAddApiExplorer 至少需要 MVC Core。对于 API 个项目,AddControllers 代表您调用 AddApiExplorer

但为什么一切仍然适用于 AddEndpointsApiExplorer

随着端点路由的引入,路由系统中的一切都归结为Endpoint。 ASP.NET 核心使用 应用程序模型 ,即 ApplicationModelControllerModelActionModel,来创建 Endpoint 实例和向路由系统注册它们。 最小 APIs,但是,使用构建器直接创建和注册单个 Endpoint 个实例。

默认的 API Explorer 实现提供了一个 IApiDescriptionProvider 应用程序模型 构建 ApiDescription 个实例。 Minimal APIs 没有 Application Model 所以没有什么可以从中构建 ApiDescription 实例。 API Explorer 提供了这些描述,OpenAPI 生成器等工具通常使用这些描述。如果没有任何描述,将不支持 Minimal APIs 和 OpenAPI;那会很糟糕(或者,至少,肯定不会被开发人员接受)。为了解决这个问题,ASP.NET 核心团队创建了第二个 IApiDescriptionProvider,它只考虑 Endpoint.

如果一切都是 Endpoint,为什么不合并实现?

这个答案分为两部分。首先,改变原来的 IApiDescriptionProvider 实现会引入一个 public,破坏性的变化。至少,需要新的构造函数参数。由于这是一个主要的版本冲突,这种方法并没有脱离 table,但事实证明它是无关紧要的。更大的问题是原始的 IApiDescriptionProvider 实现和 AddApiExplorer 存在于并依赖于 MVC 核心。 最小 APIs 只需要路由抽象。如果不添加不必要的耦合,就无法将两者合并。为了解决这个问题,添加了 AddEndpointsApiExplorer,它添加了一个只需要 IApiDescriptionProvider 实现的实现,该实现基于来自路由系统的基本 Endpoint 定义。

如果 AddEndpointsApiExplorer 存在并且我调用它,我还需要 AddApiExplorer 吗?可能是。在 Minimal API Endpoint 实例上公开和可用的元数据比 Application Model 轻得多;毕竟,它们是 最小的 。在幕后,IApiDescriptionGroupCollectionProvider 实现采用一系列 IApiDescriptionProvider 实例。如果调用 AddEndpointsApiExplorerAddApiExplorer,则两个提供程序都将执行。如果仅调用 AddEndpointsApiExplorer,它将以常规 'ol controllers, but the descriptions' 信息保真度工作 可能 低于您习惯的。如果您只创作 Minimal APIs,那么如果您想要 API Explorer 支持,则需要 AddEndpointsApiExplorer

The fidelity between the two methods is improving even more in .NET 7.0. In some future release, it's possible we might see these approaches coalesce into one.

TL;DR

如果您使用 v6 的“最小 API”,则仅使用 AddEndpointsApiExplorer,如下所示:

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