Nuget包

  1. Swashbuckle.AspNetCore

Program.cs

swagger支持 API 自动生成同步的在线文档,下面在.NET6中引入

  1. builder.Services.AddEndpointsApiExplorer();
  2. builder.Services.AddSwaggerGen(options =>
  3. {
  4. options.SwaggerDoc("v1", new OpenApiInfo
  5. {
  6. Version = "v1",
  7. Title = "API标题",
  8. Description = "API描述"
  9. });
  10. var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
  11. options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));
  12. });
  13. var appSetting = new AppSetting();

实体类

  1. namespace ES.NET.Client.Demo.Models;
  2. /// <summary>
  3. /// 用血明细
  4. /// </summary>
  5. public class BoutItems
  6. {
  7. /// <summary>
  8. /// 索引Id
  9. /// </summary>
  10. public int Id { get; set; }
  11. /// <summary>
  12. /// 科室Id
  13. /// </summary>
  14. public int Deptno { get; set; }
  15. /// <summary>
  16. /// 科室名称
  17. /// </summary>
  18. public string Deptname { get; set; }
  19. /// <summary>
  20. /// 血制品编号
  21. /// </summary>
  22. public string Bloodno { get; set; }
  23. /// <summary>
  24. /// 血制品名称
  25. /// </summary>
  26. public string Bloodname { get; set; }
  27. /// <summary>
  28. /// 用血量
  29. /// </summary>
  30. public float Boutcount { get; set; }
  31. /// <summary>
  32. /// 单位
  33. /// </summary>
  34. public string Bloodunitname { get; set; }
  35. /// <summary>
  36. /// 出库日期
  37. /// </summary>
  38. public DateTime Bodate { get; set; }
  39. }

控制器类

  1. using Elastic.Clients.Elasticsearch;
  2. using Elastic.Clients.Elasticsearch.QueryDsl;
  3. using ES.NET.Client.Demo.Models;
  4. using ES.NET.Client.Demo.Services;
  5. using Microsoft.AspNetCore.Mvc;
  6. using Microsoft.Extensions.Options;
  7. namespace ES.NET.Client.Demo.Controllers.ES;
  8. /// <summary>
  9. /// 血库明细索引控制器
  10. /// </summary>
  11. public class BoutItemsController : AreaController
  12. {
  13. private readonly ElasticSetting elasticSetting;
  14. private readonly ElasticsearchClient esClient;
  15. public BoutItemsController(IOptionsSnapshot<AppSetting> options,IElasticSearchHelper esClientConnHelp)
  16. {
  17. if (options == null || options.Value == null)
  18. throw new ArgumentNullException(nameof(options));
  19. if(esClientConnHelp.ESClient==null)
  20. throw new ArgumentNullException(nameof(esClientConnHelp));
  21. elasticSetting = options.Value.ElasticSetting;
  22. esClient = esClientConnHelp.ESClient;
  23. }
  24. /// <summary>
  25. /// 创建索引
  26. /// </summary>
  27. /// <param name="entity"></param>
  28. /// <returns></returns>
  29. [HttpPut]
  30. public async Task<IActionResult> IndexAsync(BoutItems entity)
  31. {
  32. if (entity == null || entity.Id <= 0) return NoContent();
  33. var response = await esClient.IndexAsync(entity, request => request.Index(elasticSetting.IndexSetting.BOutIndex));
  34. if (response.IsValid)
  35. {
  36. Console.WriteLine($"Index document with ID {response.Id} succeeded.");
  37. }
  38. return Ok(response);
  39. }
  40. /// <summary>
  41. /// 获取文档
  42. /// </summary>
  43. /// <param name="id"></param>
  44. /// <returns></returns>
  45. [HttpGet]
  46. public async Task<IActionResult> GetAsync(string id)
  47. {
  48. var response = await esClient.GetAsync<BoutItems>(id, idx => idx.Index(elasticSetting.IndexSetting.BOutIndex));
  49. var entity = response.Source;
  50. return Ok(entity);
  51. }
  52. /// <summary>
  53. /// 搜索文档(lambda方式)
  54. /// </summary>
  55. /// <param name="userName"></param>
  56. /// <returns></returns>
  57. [HttpGet]
  58. public async Task<IActionResult> SearchAsync(string deptname)
  59. {
  60. var response = await esClient.SearchAsync<BoutItems>(s => s
  61. .Index(elasticSetting.IndexSetting.BOutIndex)
  62. .From(0)
  63. .Size(10)
  64. .Query(q => q
  65. .Term(t => t.Deptname, deptname)
  66. )
  67. );
  68. if (response.IsValid)
  69. {
  70. var entity = response.Documents.FirstOrDefault();
  71. return Ok(entity);
  72. }
  73. else
  74. {
  75. return NotFound();
  76. }
  77. }
  78. /// <summary>
  79. /// 搜索文档(实体对象方式)
  80. /// </summary>
  81. /// <param name="deptname"></param>
  82. /// <returns></returns>
  83. [HttpGet]
  84. public async Task<IActionResult> SearchRequestAsync(string deptname)
  85. {
  86. var request = new SearchRequest(elasticSetting.IndexSetting.BOutIndex)
  87. {
  88. From = 0,
  89. Size = 10,
  90. Query = new TermQuery("deptname") { Value = deptname }
  91. };
  92. var response = await esClient.SearchAsync<BoutItems>(request);
  93. if (response.IsValid)
  94. {
  95. var entity = response.Documents.FirstOrDefault();
  96. return Ok(entity);
  97. }
  98. else
  99. {
  100. return NotFound();
  101. }
  102. }
  103. /// <summary>
  104. /// 更新文档
  105. /// </summary>
  106. /// <param name="entity"></param>
  107. /// <returns></returns>
  108. [HttpPost]
  109. public async Task<IActionResult> UpdateAsync(BoutItems entity)
  110. {
  111. if (entity == null || entity.Id <= 0) return NoContent();
  112. var response = await esClient.UpdateAsync<BoutItems, object>(elasticSetting.IndexSetting.BOutIndex, entity.Id.ToString(), u => u
  113. .Doc(entity));
  114. if (response.IsValid)
  115. {
  116. Console.WriteLine("Update document succeeded.");
  117. }
  118. return Ok(response);
  119. }
  120. /// <summary>
  121. /// 删除文档
  122. /// </summary>
  123. /// <param name="id"></param>
  124. /// <returns></returns>
  125. [HttpPost]
  126. public async Task<IActionResult> DeleteAsync(string id)
  127. {
  128. if (string.IsNullOrWhiteSpace(id)) return NoContent();
  129. var response = await esClient.DeleteAsync(elasticSetting.IndexSetting.BOutIndex, id);
  130. if (response.IsValid)
  131. {
  132. Console.WriteLine("Delete document succeeded.");
  133. }
  134. return Ok(response);
  135. }
  136. }

生成xml文件

生成xml文件,接口文档生成注释需要程序集的xml文件
打开项目的.csproj文件加上标识让程序生成这个程序集的文档

  1. <GenerateDocumentationFile>true</GenerateDocumentationFile>
  1. <Project Sdk="Microsoft.NET.Sdk.Web">
  2. <PropertyGroup>
  3. <TargetFramework>net6.0</TargetFramework>
  4. <Nullable>enable</Nullable>
  5. <ImplicitUsings>enable</ImplicitUsings>
  6. <GenerateDocumentationFile>true</GenerateDocumentationFile>
  7. </PropertyGroup>
  8. <ItemGroup>
  9. <PackageReference Include="Elastic.Clients.Elasticsearch" Version="8.0.0-beta.5" />
  10. <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
  11. </ItemGroup>
  12. </Project>

运行测试

1665146916377.png
1665146949072.png