首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AddEndpointsApiExplorer在ASP.NET核心6中是什么?

AddEndpointsApiExplorer在ASP.NET核心6中是什么?
EN

Stack Overflow用户
提问于 2022-04-20 01:04:34
回答 3查看 10K关注 0票数 24

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

v5中的服务配置

代码语言:javascript
运行
复制
services.AddSwaggerGen();

v6中的服务配置

代码语言:javascript
运行
复制
builder.Services.AddEndpointsApiExplorer();    // what is this?
builder.Services.AddSwaggerGen();

AddEndpointsApiExplorer是什么?不管我加不加,一切都如预期的那样工作。

我使用"ASP.NET API版本控制“图书馆。他们是亲戚吗?如果是这样的话,我必须同时使用这两种方法,只使用库,还是现在没有必要使用库?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-04-20 02:47:28

AddEndpointsApiExplorer是最低限度的API,而AddApiExplorer至少需要MVC核心。对于API项目,AddControllers代表您调用AddApiExplorer

但是为什么所有的东西都与AddEndpointsApiExplorer**?** 一起工作呢?

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

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

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

这个答案有两部分。首先,更改原始的IApiDescriptionProvider实现将引入一个公共的、破坏性的更改。至少需要新的构造函数参数。因为这是一个主要的版本碰撞,这种方法并没有脱离桌面,但事实证明它是不相关的。更大的问题是,最初的IApiDescriptionProvider实现和AddApiExplorer生活在和依赖于MVC核心。最小的API只需要路由抽象。如果不添加不必要的耦合,就无法将两者合并。为了解决这个问题,添加了AddEndpointsApiExplorer,它添加了一个只需要基于路由系统的基本Endpoint定义的IApiDescriptionProvider实现的实现。

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

在.NET 7.0中,这两种方法之间的保真度提高得更多。在未来的某个版本中,我们可能会看到这些方法结合在一起。

票数 32
EN

Stack Overflow用户

发布于 2022-04-20 02:02:21

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

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

从源代码& 怪罪反向工作,我找到了相关项目。因此,答案似乎与对最小Api's的支持有关。

我相信一些新的服务是为了从这些新的最小api中提取返回类型信息而创建的,当使用没有MVC的端点路由时,这种方式可能适用于更一般的方式。

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

而使用最小api的昂首阔步文档包括对.AddEndpointsApiExplorer()的调用。即便如此,也不能确切地解释为什么需要这样做。

为什么.AddEndpointsApiExplorer()会存在?为什么新特性被排除在.AddApiExplorer()之外?为什么在v6的其他文档中忽略了这个方法重命名?

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

票数 8
EN

Stack Overflow用户

发布于 2022-04-20 08:32:55

TL;DR

只有在使用V6的“最小API”时才使用AddEndpointsApiExplorer,这些API如下所示:

代码语言:javascript
运行
复制
app.MapGet("/", () => "Hello World!");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71932980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档