我正在升级一个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使用应用模型,即ApplicationModel
、ControllerModel
和ActionModel
,来创建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
实例。如果调用AddEndpointsApiExplorer
和AddApiExplorer
,则两个提供程序都将执行。如果只调用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!");