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的源碼:
最後,接口的列表元素類型是這個:
ApiDescription