ASP中的addendpointapiexplorer是什么?. NET Core 6



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

v5中的服务配置:

services.AddSwaggerGen();

v6版本的业务配置:

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

AddEndpointsApiExplorer是什么?不管我加不加,一切都如我所料。

我使用"ASP。. NET API版本管理图书馆。他们有亲戚关系吗?如果是这样,我必须两者都使用吗?仅仅使用库,还是现在不需要库?

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

但是为什么AddEndpointsApiExplorer仍然可以工作?

随着端点路由的引入,路由系统中的一切都归结为一个Endpoint。ASP。. NET Core使用应用模型,即ApplicationModelControllerModelActionModel,来创建Endpoint实例并将它们注册到路由系统。最小api使用构建器直接创建和注册单个Endpoint实例。

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

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

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

如果AddEndpointsApiExplorer存在并且我调用它,我还需要AddApiExplorer吗?也许吧。在Minimal APIEndpoint实例上公开和可用的元数据比Application Model轻得多;毕竟,它们是最小的。在幕后,IApiDescriptionGroupCollectionProvider实现采用一系列IApiDescriptionProvider实例。如果调用AddEndpointsApiExplorerAddApiExplorer,则两个提供程序都将执行。如果只调用AddEndpointsApiExplorer,它将与常规的"ol控制器"一起工作,但是描述的信息保真度可能比您习惯的要小。如果你只创作Minimal API,那么如果你想要API Explorer支持,AddEndpointsApiExplorer是必需的。

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

;.AddEndpointsApiExplorer()是为了支持最小Api而创建的。

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

从源代码向后工作&责备,我找到了相关的项目。因此,答案似乎与支持最小Api有关。

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

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

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

为什么.AddEndpointsApiExplorer()存在?为什么新功能被排除在.AddApiExplorer()之外?为什么在v6的其他文档中没有使用rename方法?

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

TL;DR

如果您使用v6的"最小api",则仅使用AddEndpointsApiExplorer,如下所示:

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

最新更新