参考 :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

												

最新文章

  1. linux练习题
  2. python 常用高效代码写法集锦
  3. jquery 获取 json文件内容后,将其内容显示到 下拉列表框中,再将下拉列表中的内容,显示到文本框中
  4. Laxcus大数据管理系统2.0(5)- 第二章 数据组织
  5. 【转】iOS开发UI篇—iPad和iPhone开发的比较
  6. (转)Centos5.5安装MONO2.10.8和Jexus 5.0开启Linux平台.net应用新篇章
  7. cocos2dx3.4 保存json文件
  8. CentOS 配置httpd使局域网能够正常訪问
  9. 闲扯 Javascript 03 时钟和QQ延时框
  10. Android支付接入(七):Google In-app-Billing
  11. eclipse hibernate plugin
  12. C++移位运算符详解
  13. Linux下安装使用Redis
  14. listview 点击时间被拦截
  15. Guid的生成和数据修整(去除空格和小写字符)
  16. 1228.Poor Pigs 可怜的猪
  17. Pycharm中flask框架应用
  18. HDU 3526 Computer Assembling(最小割)
  19. 学习使用NotePad++
  20. xml 类详解

热门文章

  1. 用vscode编辑代码
  2. 组合数学---P1358 扑克牌
  3. nodejs做中间层,转发请求
  4. decimal赋值
  5. pycharm 中文乱码
  6. 33Flutter仿京东商城项目 登录 注册相关页面布局
  7. linux简单命令2---文件搜索命令
  8. SpringBoot集成Spring MVC视图
  9. 123456---com.twoapp.ErTongNongChangPinTu---儿童农场拼图
  10. windows的mysql无法启动 服务没有报告任何错误