发布于 2022-04-20 02:47:28
AddEndpointsApiExplorer
是最低限度的API,而AddApiExplorer
至少需要MVC核心。对于API项目,AddControllers
代表您调用AddApiExplorer
。
但是为什么所有的东西都与AddEndpointsApiExplorer
**?** 一起工作呢?
随着端点路由的引入,路由系统中的一切都归结为Endpoint
。ASP.NET核心使用应用程序模型,即ApplicationModel
、ControllerModel
和ActionModel
来创建Endpoint
实例并将它们注册到路由系统中。但是,最小API使用构建器直接创建和注册单个Endpoint
实例。
默认的API实现提供了一个IApiDescriptionProvider
,它从应用程序模型构建ApiDescription
实例。最小的API没有应用程序模型,因此没有什么可用于构建ApiDescription
实例的。are提供了这些描述,这些描述通常由诸如OpenAPI生成器之类的工具使用。如果没有任何描述,就不会支持最小的API和OpenAPI;这将是糟糕的(或者至少不被开发人员所接受)。为了解决这个问题,ASP.NET核心团队创建了第二个只考虑Endpoint
的IApiDescriptionProvider
。
如果一切都是Endpoint
**,,为什么不合并实现?**
这个答案有两部分。首先,更改原始的IApiDescriptionProvider
实现将引入一个公共的、破坏性的更改。至少需要新的构造函数参数。因为这是一个主要的版本碰撞,这种方法并没有脱离桌面,但事实证明它是不相关的。更大的问题是,最初的IApiDescriptionProvider
实现和AddApiExplorer
生活在和依赖于MVC核心。最小的API只需要路由抽象。如果不添加不必要的耦合,就无法将两者合并。为了解决这个问题,添加了AddEndpointsApiExplorer
,它添加了一个只需要基于路由系统的基本Endpoint
定义的IApiDescriptionProvider
实现的实现。
如果AddEndpointsApiExplorer
存在并且我称之为它,我还需要AddApiExplorer
吗?也许吧。在最小API Endpoint
实例上公开和可用的元数据比应用程序模型轻得多;毕竟,它们是最小的。在幕后,IApiDescriptionGroupCollectionProvider
实现接受一系列IApiDescriptionProvider
实例。如果调用了AddEndpointsApiExplorer
和AddApiExplorer
,那么两个提供程序都将执行。如果只调用AddEndpointsApiExplorer
,它将与常规的“ol控制器”一起工作,但是描述的信息保真度可能比您习惯的要小。如果您只创作最小的API,那么如果您想要API支持,就需要AddEndpointsApiExplorer
。
在.NET 7.0中,这两种方法之间的保真度提高得更多。在未来的某个版本中,我们可能会看到这些方法结合在一起。
发布于 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/上创建一个问题来要求澄清,这样其他人就不必问这些问题了。
发布于 2022-04-20 08:32:55
TL;DR
只有在使用V6的“最小API”时才使用AddEndpointsApiExplorer
,这些API如下所示:
app.MapGet("/", () => "Hello World!");
https://stackoverflow.com/questions/71932980
复制相似问题