WebApi client的面向切面編程

.Net的面向切面編程

.Net的服務端應用AOP很常見,在Asp.net MVC與Asp.net WebApi等新框架裏到處都有AOP的影子,我們可以把一個服務方法“切”爲很多面,日誌面、驗證面、請求方式處理、接口業務實現等多個面,有一些面可以使用過濾器特性(FilterAttribute)進行編寫,然後很方便和打上特性即可,對於一般的工程師,只需要專注實現接口業務實現。

在流行SOAP的年代,很少需要一個強悍的Client,而今天restful時代,.net也出了一個HttpClient,可以說是與Asp.net WebApi相配吧,雖然HttpClient相對WebClient在http接口請求有了質的變化,但相比服務端的webApi,AOP的影子都不見了。

讓HttpClient支持AOP

所謂讓HttpClient支持AOP,是指在對HttpClient進行組合封裝,基於HttpClient再打造一款客戶端框架,將AOP的理念引入到新客戶端框架來,我們可以簡單分析一下HttpClient請求一個接口要做的基本事情,同時把這些事情“切”爲多個面,Http請求大致如下:

{Method} {Path}?query1={value1}&query2={value2}

{Header1}

{Header2}

{body}

我可以切出幾個面:

method與path處理

query參數處理

請求body內容處理

發送請求

回覆結果處理

我們所做的框架,需要把1、2、3、5封裝爲面,同時調用HttpClient來完成第4個動作。

AOP基礎框架的選擇

可以參考這個博客:NET AOP(一)七種AOP實現方法

這裏我選擇了Castle,Castle可以動態創建接口的實現類並實例化,可以對接口方法調用前進行攔截,並設置返回結果。

我們可以根據這個攔截功能,收集每個面的配置,組裝爲http請求消息,然後調用HttpClient爲完成發送請求,再讓第5個面來進行回覆結果處理。基於Castle與HttpClient,我們就可以封裝出支持AOP的HttpClient新框架,這裏命名爲WebApiClient吧。

WebApiClient設計

現在,我們的目標是,讓調用WebApi與編寫WebApi一樣,聲明接口、參數、返回值,打上請求方法與路徑(面)特性、返回結果處理(面)特性、請求內容(面)特性。然後框架幫我們實現並取得實例,然後就可以調用這些接口了。

Step1:聲明接口

strip

namespaceDemo

{

[JsonReturn]

[HttpHost("http://www.mywebapi.com")]publicinterfaceMyWebApi

{

[HttpGet("/webapi/{type}/about")]//GET webapi/typeValue/aboutTask> GetAboutAsync(stringtype);

[HttpGet("/webapi/user")]//GET webapi/user?userName=aa&nickName=bb&&BeginTime=cc&EndTime=ddTask> GetUserAsync(stringuserName,stringnickName, TimeFilter timeFilter);

[HttpPut("/webapi/user")]//PUT webapi/userTask>UpdateUserAsync([JsonContent] UserInfo loginInfo);

[HttpDelete("/webapi/user")]//DELETE  webapi/user?id=idValueTask> DeleteUserAsync(stringid);

[HttpDelete("/webapi/user/{id}")]//DELETE  webapi/user/idValueTask> DeleteUser2Async(stringid);

}

}

strip

Step2:獲取接口實並調用

strip

namespaceDemo

{classProgram

{staticasyncvoidTest()

{varmyWebApi =newWebApiClient.HttpApiClient().GetHttpApi();awaitmyWebApi.GetAboutAsync("typeValue");awaitmyWebApi.UpdateUserAsync(newUserInfo { UserName ="abc", Password ="123456"});awaitmyWebApi.DeleteUser2Async(id:"id001");

}staticvoidMain(string[] args)        {            Test();            Console.ReadLine();        }    }}

strip

WebApiClient更多的面

我們可以給框架增加更多的自定義面,比如日誌記錄、返回結果統一驗證等等,這些就不一一介紹,但思想還是一樣的。

WebApiClient開放

這是一個開放的框架,託管在https://github.com/xljiulang/WebApiClient

歡迎加入技術QQ羣:364595326



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章