將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;
}
}