ASP.NET Core 6 中的 AddEndpointsApiExplorer 是什么

lon*_*nix 67 c# swashbuckle asp.net-core aspnet-api-versioning asp.net-core-6.0

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

v5中的服务配置:

services.AddSwaggerGen();
Run Code Online (Sandbox Code Playgroud)

v6中的服务配置:

builder.Services.AddEndpointsApiExplorer();    // what is this?
builder.Services.AddSwaggerGen();
Run Code Online (Sandbox Code Playgroud)

什么是AddEndpointsApiExplorer?无论我是否添加,一切都会按预期进行。

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

Chr*_*nez 77

AddEndpointsApiExplorer适用于最小 API ,而AddApiExplorer至少需要 MVC 核心。对于 API 项目,请代表您AddControllers致电AddApiExplorer

但为什么一切仍然有效AddEndpointsApiExplorer

随着端点路由的引入,路由系统中的所有内容都归结为一个Endpoint. ASP.NET Core 使用应用程序模型(即和 )ApplicationModel来创建实例并向路由系统注册它们。然而,最小 API使用构建器直接创建和注册单个实例。ControllerModelActionModelEndpointEndpoint

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

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

这个答案有两个部分。首先,改变原来的IApiDescriptionProvider实现将引入一个公开的、突破性的改变。至少需要新的构造函数参数。由于这是一个主要版本的提升,这种方法并没有被排除在外,但事实证明它是无关紧要的。更大的问题是原始IApiDescriptionProvider实现AddApiExplorer依赖于 MVC Core。最小 API仅需要路由抽象。没有办法在不增加不必要的耦合的情况下将两者合并。为了解决这个问题,AddEndpointsApiExplorer添加了一个实现,该实现只需要IApiDescriptionProvider基于Endpoint路由系统的基本定义的实现。

如果AddEndpointsApiExplorer存在并且我调用它,我还需要AddApiExplorer吗?或许。Minimal API 实例上公开和可用的元数据比应用程序模型Endpoint轻得多;毕竟,它们是最小的。在幕后,实现需要一系列实例。如果和被调用,那么两个提供者都会执行。如果仅调用,它将与常规“ol 控制器”一起使用,但描述的信息保真度可能会低于您所习惯的。如果您仅编写Minimal API,并且需要 API Explorer 支持,则需要。IApiDescriptionGroupCollectionProviderIApiDescriptionProviderAddEndpointsApiExplorerAddApiExplorerAddEndpointsApiExplorerAddEndpointsApiExplorer

在 .NET 7.0 中,这两种方法之间的保真度得到了进一步提高。在未来的某个版本中,我们可能看到这些方法合并为一。


Jer*_*man 23

太长了;.AddEndpointsApiExplorer()创建是为了支持Minimal Api 的.

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

从源代码和git Blame逆向工作,我找到了相关项目所以答案似乎与对Minimal Api 的支持有关。

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

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

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

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

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

  • 谢谢!哇,我希望有一个“代码考古学家”标签,因为那是你应得的。:-) 感谢您对此进行深入研究。这绝对适用于最小的 API,我在[此处](https://github.com/dotnet/aspnet-api-versioning/issues/819) 与 @ChrisMartinez 确认。但来自 asp.net 方面的问题仍然存在 - 我将按照您的建议在文档存储库上创建一个问题。 (2认同)

lon*_*nix 9

长话短说

AddEndpointsApiExplorer当您使用 v6 的“最小 API”时才使用,如下所示:

app.MapGet("/", () => "Hello World!");
Run Code Online (Sandbox Code Playgroud)