Asp.net Core的Swagger介面根據模塊、版本分組

来源:https://www.cnblogs.com/caijt/archive/2019/04/20/10739841.html
-Advertisement-
Play Games

近期一直在學習Asp.net Core,微軟的文檔太難看,都是英文翻譯過來的,很不友好,感謝這個博客,從壹開始前後端分離【 .NET Core2.0 +Vue2.0 】,讓我入門了,剛學到這個Swagger時,我就有個需求,因為我之前寫過的系統是分了不同的模塊,模塊裡面再分控制器,不同模塊經常會有相 ...


近期一直在學習Asp.net Core,微軟的文檔太難看,都是英文翻譯過來的,很不友好,感謝這個博客,從壹開始前後端分離【 .NET Core2.0 +Vue2.0 】,讓我入門了,剛學到這個Swagger時,我就有個需求,因為我之前寫過的系統是分了不同的模塊,模塊裡面再分控制器,不同模塊經常會有相同名稱的控制器,例如銷售中心模塊里有個合同管理控制器,採購中心模塊里也有個合同管理控制器,而且我一個系統介面可能得上百個,那如果都在一個頁面顯示的話,那也太多了,所以我想能不能把介面進行分組。

在博客系統後面也有介紹到Swagger:API多版本控制,帶來的思考,還有網上查到的【dotNet Core】Swagger下簡單的給WebApi分組(我發現網上關於Asp.net Core的資料還是比較少),再結合我自己的需求修改了一下。

先說下我的想法:

定義一個系統分組枚舉Enum,包含我系統所有的控制器分組(或者版本),然後再定義一個特性Attribute,可以接收剛纔那個Enum值,在需要分組的控制器類上面定義特性Attribute,Swagger根據系統分組枚舉Enum的值進行分組,將特性Attribute的分組枚舉值一樣的歸為同一個分組,沒有加特性Attribute的歸在無分組下,最終效果如下

 

 

下麵是我的代碼,理解為主,不用完全按我寫的

基礎Swagger的用法就不說的,具體可看 從壹開始前後端分離【 .NET Core2.0 +Vue2.0 】這個大師關於Swagger部分的教程,非常適合初級入門

在項目創建一個目錄(ApiGroup),然後創建三個類,分別為ApiGroupAttribute.cs(控制器特性),ApiGroupNames.css(系統分組枚舉),GroupInfoAttribute.cs(給系統分組枚舉值增加相關信息的特性,這個主要是用於在Swagger分組時可關聯Title,Version,Description值)

 

 ApiGroupAttribute.cs代碼如下

using Microsoft.AspNetCore.Mvc.ApiExplorer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ItSys.ApiGroup
{
    /// <summary>
    /// 系統分組特性
    /// </summary>
    public class ApiGroupAttribute : Attribute, IApiDescriptionGroupNameProvider
    {
        public ApiGroupAttribute(ApiGroupNames name)
        {
            GroupName = name.ToString();
        }
        public string GroupName { get; set; }
    }
}

 ApiGroupNames.cs代碼如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ItSys.ApiGroup
{
    /// <summary>
    /// 系統分組枚舉值
    /// </summary>
    public enum ApiGroupNames
    {
        [GroupInfo(Title ="登錄認證",Description ="登錄認證相關介面",Version ="v1")]
        Auth,
        [GroupInfo(Title = "IT", Description = "登錄認證相關介面")]
        It,
        [GroupInfo(Title = "人力資源", Description = "登錄認證相關介面")]
        Hr,
        Cw
    }
}

GroupInfoAttribute.cs代碼如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ItSys.ApiGroup
{
    /// <summary>
    /// 系統模塊枚舉註釋
    /// </summary>
    public class GroupInfoAttribute : Attribute
    {
        public string Title { get; set; }
        public string Version { get; set; }
        public string Description { get; set; }
    }
}

 

打開Startup.cs文件修改ConfigureServices方法(為了方便查看,只列出關於Swagger分組的關鍵代碼)

public void ConfigureServices(IServiceCollection services)
{
    
    #region Swagger
    services.AddSwaggerGen(options =>
    {
        //遍歷ApiGroupNames所有枚舉值生成介面文檔,Skip(1)是因為Enum第一個FieldInfo是內置的一個Int值
        typeof(ApiGroupNames).GetFields().Skip(1).ToList().ForEach(f =>
        {
            //獲取枚舉值上的特性
            var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType<GroupInfoAttribute>().FirstOrDefault();
            options.SwaggerDoc(f.Name, new Swashbuckle.AspNetCore.Swagger.Info
            {
                Title = info?.Title,
                Version = info?.Version,
                Description = info?.Description
            });
        });
        //沒有加特性的分到這個NoGroup上
        options.SwaggerDoc("NoGroup", new Swashbuckle.AspNetCore.Swagger.Info
        {
            Title = "無分組"
        });
        //判斷介面歸於哪個分組
        options.DocInclusionPredicate((docName, apiDescription) =>
        {
            if (docName == "NoGroup")
            {
                //當分組為NoGroup時,只要沒加特性的都屬於這個組
                return string.IsNullOrEmpty(apiDescription.GroupName);
            }
            else
            {
                return apiDescription.GroupName == docName;
            }
        });
}

修改Configure方法

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{

    #region Swagger
    app.UseSwagger();
    app.UseSwaggerUI(options =>
    {
        //遍歷ApiGroupNames所有枚舉值生成介面文檔,Skip(1)是因為Enum第一個FieldInfo是內置的一個Int值
        typeof(ApiGroupNames).GetFields().Skip(1).ToList().ForEach(f =>
        {
            //獲取枚舉值上的特性
            var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType<GroupInfoAttribute>().FirstOrDefault();
            options.SwaggerEndpoint($"/swagger/{f.Name}/swagger.json", info != null ? info.Title : f.Name);

        });
        options.SwaggerEndpoint("/swagger/NoGroup/swagger.json", "無分組");
    });
    #endregion
}

然後你F6生成一下,沒出錯的話,就Ctrl+F5看看,正常的話就會在Swagger右上角看到分組了。

 

 在你需要進行分組的控制器上加上這個分組就ok了

 

目前是一個介面只歸為一個分組,但可能實際中有些公用介面,會出現在多個分組模塊里的,那可以將ApiGroupAttribute增加一個string[]或ApiGroupNames[]屬性,接收多個枚舉值,或者定義多個ApiGroupAttribute特性,不過在ConfigureServices里的Swagger的DocInclusionPredicate分組過濾方法里,就不能單判斷GroupName參數了,可以利用參數ApiDescription反射得出介面控制器上的ApiGroupAttribute特性,獲取所有的ApiGroupNames枚舉值,再進行判斷,實現一個介面可以歸為多個分組。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通常情況下引用類型的相等性是不應該被重定義/重寫的。 例如兩個引用類型的變數 x 和 y,如果這樣寫:if(x == y) {...},那麼大家都明白,這個比較的是引用的相等性。 但是有少數情況下,也可以為引用類型重寫相等性。 例如這個類: 這個類裡面只有兩個string類型的屬性和欄位,那麼對它的 ...
  • Xamarin.Form與Xamarin.Android或Xamarin.IOS的區別簡述: 可能剛剛接觸Xamarin的人來說,對於這個概念比較的模糊,認為這說的不都是同一個東西嗎?事實並不是這樣的,我們先來說說Xamarin.Android和Xamarin.IOS吧,這兩個其實就是一個單獨的工程 ...
  • 對應Framework版本重新註冊 2.0:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i 4.0:C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_regi ...
  • 參考自:https://blog.csdn.net/whl632359961/article/details/73468115 https://www.cnblogs.com/ywl925/archive/2012/11/24/2786105.html 以下是自己做的該功能(發送簡訊、獲取簡訊餘額條 ...
  • 第一種 簡單尋路 地面接觸到的。到達目標點不用跳躍能夠一直走路到達。場景視圖中簡單搭設幾個物體。膠囊體為尋路者,黃球為目標點 紅地板,綠色障礙物。現將地板以及障礙物選中 在檢視面板設置靜態為Navigation Static 如圖2然後菜單欄選擇視窗 Window –Navigation然後選擇Al ...
  • 最近將自己負責的一個核心介面系統從.Net Framework遷移到了.Net Core。 整體過程,從業務層面說一般般吧(整體還好但還是搞的業務有感,沒出嚴重故障)但是技術層面上感覺其實並沒有達到要求,不過預期也是應該不會那麼順利,接下來可能還需要幾個小Fix來處理各種奇奇怪怪的問題。 回顧下遷移 ...
  • Escape: 複製代碼 代碼如下: public static string Escape(string str) { StringBuilder sb = new StringBuilder(); foreach (char c in str) { sb.Append((Char.IsLette ...
  • 項目需求(Winform)可以批量列印某個模板,經過百度和摸索,使用iTextSharp+ZXing.Net+FreeSpire.PDF三個類庫實現了生成pdf、生成條形碼和列印pdf功能。 首先在項目作用使用NuGet獲取這三個類庫的引用。 其次把C:\Windows\Fonts裡面的微軟雅黑字體 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...