天天看點

WebApi client 的面向切面程式設計

.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進行組合封裝,基于HttpClient再打造一款用戶端架構,将AOP的理念引入到新用戶端架構來,我們可以簡單分析一下HttpClient請求一個接口要做的基本事情,同時把這些事情“切”為多個面,Http請求大緻如下:

我可以切出幾個面:

method與path處理

query參數處理

請求body内容處理

發送請求

回複結果處理

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

可以參考這個部落格:NET AOP(一)七種AOP實作方法 

這裡我選擇了Castle,Castle可以動态建立接口的實作類并執行個體化,可以對接口方法調用前進行攔截,并設定傳回結果。

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

現在,我們的目标是,讓調用WebApi與編寫WebApi一樣,聲明接口、參數、傳回值,打上請求方法與路徑(面)特性、傳回結果處理(面)特性、請求内容(面)特性。然後架構幫我們實作并取得執行個體,然後就可以調用這些接口了。

Step1:聲明接口

Step2:擷取接口實并調用

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

本文轉自  zddnd  51CTO部落格,原文連結:http://blog.51cto.com/13013666/1943031

繼續閱讀