【NSwag Studio】應用(二)-進階的設定方式

 將Nwag導入專案後,若是簡單的呼叫還好,但一遇上登入驗證、複數佈版環境開發、統一行為控管等需求時,那又是另一個故事了。本文將介紹處理這些更進一步問題的基本前置處理。

前言

本文將介紹NSwag的三個進階議題,分別是【不同佈署環境下的BaseUrl處理】、【如何抽出NSwag ClientCode底層類別】、【抽出SwaggerException類別用於共用邏輯處理】。

開始實作

1.【不同佈署環境下的BaseUrl處理】,實務上開發會有複數的環境(至少有開發跟佈版),因此聰明的設定將會影響到會不會被專案整趴。(請不要再做類似"上板前將設定好的參數貼到專案中"這等鳥事了)

1-1.基本上是利用【組態管理】、【組態設定檔(app.$(Configuration).config)】,來設定參數於不同佈署環境的值。Winfrom專案的話在visual studio沒有預設設定(其實有支援),因此可以利用擴充功能【configuration transform】來進行該處理。當安裝好擴充功能後,就可以對原本的app.config右鍵進行設定了。

1-2.接著記得調整Api Client的變數取得方式。

 

2.【如何抽出NSwag ClientCode底層類別】,當Client Code多起來後,就會面臨統一管理(調整)行為的這件議題上,因此為了之後的泛型處理,也順便統一管理一些預設值,底層的處理非做不可。設定方式的話比較複雜。

2-1.首先設定Base Class Name 、打開複寫Http Client 提取方式,最後順便設定參數傳入的物件(DTO)

2-2.接著取消HttpClient的注入設定(配合3-1,改由底層給予)

2-3.最後調整Base Url的處理方式(同樣是改由底層處理)

2-4.配合上述設定補足必要的Class,分別是【NWagClient(看你怎麼命名)】與【NSwagConfiguration(看你怎麼命名)】

    public class NSwagClient
    {
        static HttpClient _DefaultHttpClient { get; set; }
            = new HttpClient();

        protected string BaseUrl { get; }
        protected HttpClient HttpClient { get; }

        public NSwagClient(NSwagConfiguration configuration)
        {
            BaseUrl = configuration.BaseUrl;
            HttpClient = configuration.HttpClient ?? _DefaultHttpClient;
        }

        protected async Task<HttpClient> CreateHttpClientAsync(System.Threading.CancellationToken cancellationToken)
        {
            await Task.Yield();
            return HttpClient;
        }
    }
    public class NSwagConfiguration
    {
        public string BaseUrl { get; set; }
        public HttpClient HttpClient { get; set; } = null;
    }

 

2-5.最後宣告Client的部分調整一下就大功告成了

    public partial class StaticConfig
    {
        public static Client DemoApiClient { get; }
            = new Client(new NSwagConfiguration
            {
                BaseUrl = ConfigurationManager.AppSettings["ApiBaseUrl"],
                //HttpClient = new HttpClient() //--可選
            });
    }

 

*延伸應用-泛型實體化(我自己是用於需要配合網路環境改變取得對應連線的容器處理)

        static T GetApi<T>(NSwagConfiguration configuration) where T : NSwagClient
        {
            return (T)System.Activator.CreateInstance(typeof(T), configuration);
        }

 

3.【抽出SwaggerException類別用於共用邏輯處理】,針對例外處理部分NSwag預設會建立一個SwaggerException的類別,但為了寫共用的錯誤例外捕捉邏輯,總不能讓不使用NSwag的專案也強制參考存放這些Client Code的專案吧?因此將該類別抽出就是另一個小細節了。

3-1.首先要先將NSwag的產生Exception選項關閉

3-2.接著將原本該有的東西放入抽出的位置就大功告成了。(從原本NSwag產生的程式碼抓取的)

3-3.實際運用的話就是在底層時可以針對Exception進行401無授權的特殊處理。

備註

1.當更多Api的Client Code建置後,可以在Namespace上做出區隔,這樣後續專案引用時會相對便利(避免命名重複等問題)

2.針對HttpClient的部分可以參考【C# - System.Net.Http.HttpClient擴充 】,並於"NSwagConfiguration"中進行類別的調整。

    public class NSwagConfiguration
    {
        public string BaseUrl { get; set; }
        public HttpClientPlus HttpClient { get; set; };
    }
    public class NSwagClient
    {
        protected string BaseUrl { get; }
        protected HttpClientPlus HttpClient { get; }

        public NSwagClient(NSwagConfiguration configuration)
        {
            BaseUrl = configuration.BaseUrl;
            HttpClient = configuration.HttpClient;
        }

        protected async Task<HttpClientPlus> CreateHttpClientAsync(System.Threading.CancellationToken cancellationToken)
        {
            await Task.Yield();
            return HttpClient;
        }
    }