Swagger 實踐 <一>

參考 :https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/getting-started-with-nswag?view=aspnetcore-2.2&tabs=visual-studiogit

1. 新建。net core 的webapi  項目。github

2.Install-Package NSwag.AspNetCoreweb

3.ServiceConfig() 中添加  services.AddSwaggerDocument();json

 這一步是添加某些依賴注入的。裏面有好多。serviceCollection.AddSingleton() 之類的東西。 源碼:https://github.com/RicoSuter/NSwagapi

4.Config() 中添加 緩存

 app.UseOpenApi();   裏面主要是 app.UseMiddleware<OpenApiDocumentMiddleware>(),添加了中間件
 app.UseSwaggerUi3(); 這裏也是添加一些中間件

下面探究下原理:mvc

OpenApiDocumentMiddleware 這個中間件中有一個 _documentsCache 字典。這個字典會包含有那個 Webapi暴露的接口的Json。
這個字典是個緩存。就是隻生成一次。下次再刷新 。。。/swagger/v1/json 的時候,直接接從字典裏拿。
最終生成的方法在這裏:
  public async Task<OpenApiDocument> GenerateAsync(object serviceProvider)
        {
            var typedServiceProvider = (IServiceProvider)serviceProvider; var mvcOptions = typedServiceProvider.GetRequiredService<IOptions<MvcOptions>>();
            var settings = GetJsonSerializerSettings(typedServiceProvider) ??
                Settings?.ActualSerializerSettings ??
                JsonConvert.DefaultSettings?.Invoke();

            Settings.ApplySettings(settings, mvcOptions.Value);

            var apiDescriptionGroupCollectionProvider = typedServiceProvider.GetRequiredService<IApiDescriptionGroupCollectionProvider>(); return await GenerateAsync(apiDescriptionGroupCollectionProvider.ApiDescriptionGroups);
        }

核心代碼是標粗的。這兩句話放在普通工程裏也能讀出全部暴露出的接口。app

 後一句是建立IApiDescriptionGroupCollectionProvider  這個接口的實例。async

public void ConfigureServices(IServiceCollection services)
{
  services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

剛進入這個方法的時候,services 有53個元素。ide

執行完  services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);  變爲260個,新增的就有 IApiDescriptionGroupCollectionProvider。

Lifetime = Singleton, ServiceType = {Name = "IApiDescriptionGroupCollectionProvider" FullName = "Microsoft.AspNetCore.Mvc.ApiExplorer.IApiDescriptionGroupCollectionProvider"}, ImplementationType = {Name = "ApiDescriptionGroupCollectionProvider" FullName = "Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescriptionGroupCollectionProvider"}

Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescriptionGroupCollectionProvider的源碼:

https://github.com/aspnet/AspNetCore/blob/master/src/Mvc/Mvc.ApiExplorer/src/ApiDescriptionGroupCollection.cs

最後,接口的列表元素類型是這個:

ApiDescription

相關文章
相關標籤/搜索