• 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)
  • 相关阅读:
    js 自定义属性
    js innerText、textContent、innerHTML的区别和各自用法
    js 的常用选择器
    js Array属性和用法
    js---String对象
    iframe自适应高度js
    thinkphp 的save()不能更新数据解决办法
    转义字符
    获取客户端真实ip
    thinkphp条件查询和模糊查询的一些方法
  • 原文地址:https://www.cnblogs.com/qgbo/p/11546837.html
Copyright © 2020-2023  润新知