Swagger 实践 <一>

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

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的源码:

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

最后,接口的列表元素类型是这个:

ApiDescription



气功波(18037675651)
原文地址:https://www.cnblogs.com/qgbo/p/11546837.html