ASP.NET Core 6 中的 AddEndpointsApiExplorer 是什么

问题描述 投票:0回答:3

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

v5中的服务配置:

services.AddSwaggerGen();
v6

中的服务配置: builder.Services.AddEndpointsApiExplorer(); // what is this? builder.Services.AddSwaggerGen();

什么是
AddEndpointsApiExplorer

?无论我是否添加,一切都会按预期工作。

我使用“ASP.NET API 版本控制”

。他们有关系吗?如果是这样,我必须同时使用两者,只使用库,还是现在不需要库?

c# asp.net-core swashbuckle asp.net-core-6.0 aspnet-api-versioning
3个回答
73
投票
AddEndpointsApiExplorer

适用于

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

但是为什么一切仍然有效

AddEndpointsApiExplorer


随着

端点路由

的引入,路由系统中的所有内容都归结为Endpoint。 ASP.NET Core 使用

应用程序模型
,即 ApplicationModel
ControllerModel
ActionModel
来创建
Endpoint
实例并将其注册到路由系统。
最少的 API
,但是,使用构建器直接创建和注册单独的 Endpoint 实例。
默认的 API Explorer 实现提供了 

IApiDescriptionProvider

,可从

应用程序模型
构建
ApiDescription
实例。 最小API没有应用程序模型,因此没有任何东西可以用来构建ApiDescription实例。 API Explorer 提供了这些描述,这些描述通常由 OpenAPI 生成器等工具使用。如果没有任何描述,就不会支持
Minimal APIs
和OpenAPI;那会很糟糕(或者至少肯定不会被开发人员接受)。为了解决这个问题,ASP.NET Core 团队创建了第二个 IApiDescriptionProvider,仅考虑
Endpoint

如果一切都是

Endpoint,为什么不合并实现?


这个答案有两个部分。首先,改变原来的 

IApiDescriptionProvider

实现将引入一个公开的、突破性的改变。至少需要新的构造函数参数。由于这是一个主要版本的提升,这种方法并没有被排除在外,但事实证明它是无关紧要的。更大的问题是原始的

IApiDescriptionProvider
实现和
AddApiExplorer
存在并依赖于 MVC Core。
最少的 API
仅需要路由抽象。没有办法在不增加不必要的耦合的情况下将两者合并。为了解决这个问题,添加了 AddEndpointsApiExplorer,它添加了一个仅需要基于路由系统中的基本
IApiDescriptionProvider
定义的
Endpoint
实现。
如果

AddEndpointsApiExplorer

存在并且我调用它,我还需要

AddApiExplorer
吗?或许。
Minimal API
Endpoint实例上公开和可用的元数据比
应用程序模型
轻得多;毕竟,它们是“最小”的。在幕后,IApiDescriptionGroupCollectionProvider 实现采用一系列 IApiDescriptionProvider 实例。如果调用
AddEndpointsApiExplorer
AddApiExplorer
,则两个提供程序都将执行。如果仅调用
AddEndpointsApiExplorer
,它将与常规的“ol 控制器”一起使用,但描述的信息保真度
可能
低于您习惯的水平。如果您仅编写
Minimal APIs
,那么如果您需要 API Explorer 支持,则需要 AddEndpointsApiExplorer
这两种方法之间的保真度在 .NET 7.0 中得到了进一步提高。在未来的某个版本中,我们有可能
可能

看到这些方法合并为一个。

TLDR;
.AddEndpointsApiExplorer()

22
投票
Minimal Api's

通过谷歌搜索文档会显示许多页面,其中包括对 .AddEndpointsApiExplorer() 的调用。但没有提及为什么需要它,或者从 v5 项目迁移时是否需要它。文档肯定缺乏。

从源代码和

gitblame
逆向工作,我找到了

相关项目

。所以答案似乎与支持Minimal Api's有关。 我相信创建了一些新服务来从这些新的最小 api 中提取返回类型信息,这种方式在不使用 MVC 的情况下使用端点路由时可能会以更通用的方式应用。 如果您使用 MVC,也许会通过

.AddControllers()

,为您调用

.AddApiExplorer()

。提供 swagger 所依赖的服务来描述控制器操作。如果这就是您所需要的,那么似乎不需要这个新的 api 调用。

虽然使用 
swagger
和最少的 api 的文档包括对

.AddEndpointsApiExplorer()

的调用。即使这样也不能准确解释为什么需要它。 为什么

.AddEndpointsApiExplorer()
存在?为什么新功能被排除在

.AddApiExplorer()

之外?为什么 v6 的其他文档中没有此方法重命名?

也许我们应该在 
https://github.com/dotnet/aspnetcore/

https://github.com/dotnet/AspNetCore.Docs/

上创建一个问题来要求澄清,这样其他人就不会问这些问题。 TL;博士


8
投票
AddEndpointsApiExplorer

,如下所示:

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

    

© www.soinside.com 2019 - 2024. All rights reserved.