我正在將 ASP.NET Core API 專案從 v5 升級到 v6。
v5中的服務配置:
services.AddSwaggerGen();
v6中的服務配置:
builder.Services.AddEndpointsApiExplorer(); // what is this?
builder.Services.AddSwaggerGen();
是什么AddEndpointsApiExplorer?無論我添加與否,一切都按預期作業。
我使用“ASP.NET API 版本控制”庫。他們有關系嗎?如果是這樣,我必須同時使用兩者,只是圖書館,還是現在不需要圖書館?
uj5u.com熱心網友回復:
AddEndpointsApiExplorer適用于Minimal API,而AddApiExplorer至少需要 MVC Core。對于 API 專案,請代表您AddControllers呼叫。AddApiExplorer
但為什么一切仍然有效AddEndpointsApiExplorer?
隨著端點路由的引入,路由系統中的一切都歸結為Endpoint. ASP.NET Core 使用應用程式模型,即ApplicationModel、ControllerModel和ActionModel,創建Endpoint實體并將它們注冊到路由系統。然而,Minimal APIsEndpoint使用構建器直接創建和注冊單個實體。
默認的 API Explorer 實作提供了從Application ModelIApiDescriptionProvider構建ApiDescription實體的方法。Minimal API沒有應用程式模型,因此沒有任何東西可以構建實體。API Explorer 提供了這些描述,這些描述通常被 OpenAPI 生成器等工具使用。沒有任何描述,將不支持Minimal API和 OpenAPI;那會很糟糕(或者,至少,開發人員肯定不會接受)。為了解決這個問題,ASP.NET Core 團隊創建了第二個只考慮.ApiDescriptionIApiDescriptionProviderEndpoint
如果一切都是一個Endpoint,為什么不合并實作?
這個答案有兩個部分。首先,改變原來的IApiDescriptionProvider實作會引入一個公開的、突破性的改變。至少需要新的建構式引數。由于這是一個主要版本的升級,這種方法并沒有被排除在外,但事實證明它是無關緊要的。更大的問題是原始IApiDescriptionProvider實作AddApiExplorer和依賴于 MVC Core。最少的 API只需要路由抽象。如果不增加不必要的耦合,就無法將兩者合并。為了解決這個問題,AddEndpointsApiExplorer添加了一個實作,該實作只需要IApiDescriptionProvider基于Endpoint路由系統的基本定義的實作。
如果AddEndpointsApiExplorer存在并且我呼叫它,我還需要它AddApiExplorer嗎?也許。Minimal API 實體上公開和可用的元資料Endpoint比Application Model輕得多;畢竟,它們是最小的。在幕后,IApiDescriptionGroupCollectionProvider實作采用一系列IApiDescriptionProvider實體。如果AddEndpointsApiExplorer和AddApiExplorer被呼叫,那么兩個提供者都將執行。如果 onlyAddEndpointsApiExplorer被呼叫,它將與常規的“ol 控制器”一起使用,但描述的資訊保真度可能低于您所習慣的。如果您只創作Minimal APIs,那么AddEndpointsApiExplorer如果您想要 API Explorer 支持,那么它是必需的。
這兩種方法之間的保真度在 .NET 7.0 中得到了進一步提高。在未來的某個版本中,我們可能會看到這些方法合二為一。
uj5u.com熱心網友回復:
TLDR;.AddEndpointsApiExplorer()創建是為了支持Minimal Api 的.
通過谷歌搜索檔案顯示了許多頁面,其中包括對.AddEndpointsApiExplorer(). 但沒有提及您為什么需要它,或者從 v5 專案遷移時是否需要它。檔案肯定是缺失的。
從源代碼和git blame向后作業,我找到了相關專案。所以答案似乎與對Minimal Api's 的支持有關。
我相信創建了一些新服務來從這些新的最小 api 中提取回傳型別資訊,這種方式在使用沒有 MVC 的端點路由時可能會以更通用的方式應用。
如果您使用的是 MVC,也許 via.AddControllers()會.AddApiExplorer()為您呼叫。提供 swagger 所依賴的服務來描述控制器動作。如果這就是您所需要的,那么似乎不需要這個新的 api 呼叫。
雖然使用具有最少 api 的swagger的檔案包括對.AddEndpointsApiExplorer(). 即使這樣也不能準確解釋為什么需要它。
為什么.AddEndpointsApiExplorer()存在?為什么新功能被排除在外.AddApiExplorer()?為什么這個方法重命名在 v6 的其他檔案中被忽略了?
也許我們應該在https://github.com/dotnet/aspnetcore/或https://github.com/dotnet/AspNetCore.Docs/上創建一個問題來要求澄清,這樣其他人就不必問這些問題了。
uj5u.com熱心網友回復:
TL;博士
僅AddEndpointsApiExplorer當您使用 v6 的“最小 API”時才使用,如下所示:
app.MapGet("/", () => "Hello World!");
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/461410.html
標籤:C# asp.net 核心 花花公子 asp.net-core-6.0 aspnet-api-版本控制
上一篇:在ASP.NETCore3.1中使用多個connectionStringDINpgsqlConnectionpostgreSQL的正確方法
