1. 新建。net core 的webapi 项目。
2.Install-Package NSwag.AspNetCore
3.ServiceConfig() 中添加 services.AddSwaggerDocument();
这一步是添加某些依赖注入的。里面有好多。serviceCollection.AddSingleton() 之类的东西。 源码:https://github.com/RicoSuter/NSwag
4.Config() 中添加
app.UseOpenApi(); 里面主要是 app.UseMiddleware<OpenApiDocumentMiddleware>(),添加了中间件
app.UseSwaggerUi3(); 这里也是添加一些中间件
下面探究下原理:
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); }
核心代码是标粗的。这两句话放在普通工程里也能读出所有暴露出的接口。
后一句是创建IApiDescriptionGroupCollectionProvider 这个接口的实例。
public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); }
刚进入这个方法的时候,services 有53个元素。
执行完 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