我正在将 ASP.NET Core API 项目从 v5 升级到 v6。
v5中的服务配置:
services.AddSwaggerGen();
v6中的服务配置:
builder.Services.AddEndpointsApiExplorer(); // what is this?
builder.Services.AddSwaggerGen();
什么是
AddEndpointsApiExplorer
?无论我是否添加,一切都会按预期工作。
我使用“ASP.NET API 版本控制”库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()
。
通过谷歌搜索文档会显示许多页面,其中包括对.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/
AddEndpointsApiExplorer
,如下所示:
app.MapGet("/", () => "Hello World!");