【转】Web API项目中使用Area对业务进行分类管理
在之前開發(fā)的很多Web API項(xiàng)目中,為了方便以及快速開發(fā),往往把整個(gè)Web API的控制器放在基目錄的Controllers目錄中,但隨著業(yè)務(wù)越來越復(fù)雜,這樣Controllers目錄中的文件就增加很快,難以管理,而且如果有不同業(yè)務(wù)模塊有重復(fù)的控制器名的話,還需要盡量避免。引入Area的作用就是把控制器按照不同的業(yè)務(wù)模塊進(jìn)行區(qū)分,方便管理,而且控制器名稱可以重名。
1、Web API項(xiàng)目引入Area進(jìn)行分類
Area在項(xiàng)目中可以稱之為區(qū)域,每個(gè)Area代表應(yīng)用程序的不同功能模塊,Area 使每個(gè)功能模塊都有各自的文件夾,文件夾中有自己的Controller、View和Model,但對于管理也增加了一定的難度。如果是Web API項(xiàng)目,我們可以把不必要的目錄移除即可,簡化對目錄的管理。
引入Area可以是我們不同的業(yè)務(wù)模塊可以重名,而且各個(gè)業(yè)務(wù)模塊管理起來也更加方便,在原先的Web API項(xiàng)目里面,它們的目錄是這樣的。
雖然我們把它們的目錄歸類,但是它們還是存放在一個(gè)命名空間下的。
?
這樣使用雖然也沒有什么問題,但是還是存在一些弊端,因此引入Area的方式對不同業(yè)務(wù)模塊的控制器進(jìn)行管理,以達(dá)到我們分類管理的目的。
引入Area前,我們的API路徑如下所示
http://localhost:9001/api/User
引入Area后,我們把常規(guī)的權(quán)限管理、字典管理等基礎(chǔ)模塊放到Framework的Area里面,那么這個(gè)時(shí)候API路徑和具體的Area相關(guān),地址則變成了如下:
http://localhost:9001/api/Framework/User
我們再來看看具體的項(xiàng)目目錄,Web API項(xiàng)目中使用Area后,Controller的目錄如下所示。
除了在各個(gè)不同Area下有不同的控制器,而且也增加了一個(gè)**AreaRegistration.cs的文件,如對應(yīng)Framework的Area,有一個(gè)FrameworkAreaRegistration.cs文件
這樣對應(yīng)下面的控制器,它的命名空間如下所示。
?
2、Web API項(xiàng)目對Area控制器的路徑映射
上面小節(jié)介紹了使用Area來對Web API控制器的分類管理,并介紹了引入Area后對控制器位置、命名空間、Web API的URL等方面的不同。這樣如果我們要解析對應(yīng)地址的Web API,那么也需要做一定的處理,否則是無法找到對應(yīng)的控制器,從而出現(xiàn)錯(cuò)誤信息。
首先我們需要修改Web API里面WebApiConfig的配置信息,如下所示。
上面指定了默認(rèn)的Web API映射,并指定結(jié)果只做JSON格式的輸出(移除XML輸出)。
為了對不同的Area實(shí)現(xiàn)API的地址處理,我們先設(shè)計(jì)一個(gè)基類,然后讓不同的Area注冊類繼承它,方便統(tǒng)一處理。
其中基類Area注冊類的CustomAreaRegistration類代碼如下所示。
有了上面的基類映射 RegisterArea函數(shù),我們只需要在子類設(shè)置對應(yīng)的AreaName基類實(shí)現(xiàn)不同Area子類的正確映射API路徑處理了。
?
當(dāng)然為了實(shí)現(xiàn)對Area的Web API控制器的URL正確解析,獲取屬于Action、Controller、以及對應(yīng)命名空間的對象,那么還需要在global.asa.cs里面添加一行代碼,如下所示。
//對Web API的Area進(jìn)行支持 GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector), new AreaHttpControllerSelector(GlobalConfiguration.Configuration));?
其中AreaHttpControllerSelector是我們自定義的HTTP控制器地址解析器,需要根據(jù)我們的地址提取出具體的控制器、Area名稱、程序集類型等,方便構(gòu)建對應(yīng)的解析器。
private HttpControllerDescriptor GetApiController(HttpRequestMessage request) {var controllerName = base.GetControllerName(request);var areaName = GetAreaName(request);if (string.IsNullOrEmpty(areaName)){return null;}var type = GetControllerTypeByArea(areaName, controllerName);if (type == null){return null;}return new HttpControllerDescriptor(_configuration, controllerName, type); }?
有了這些基礎(chǔ)的管理,我們就可以定義好我們所需要Area,然后構(gòu)建具體業(yè)務(wù)范疇下的控制器接口即可。
3、Web API在客戶端的接口調(diào)用
所有的Web API地址,都是與具體的Area有關(guān)系,例如在Framework業(yè)務(wù)下的字典模塊,它們Web API配置的地址如下所示。
<!--字典Web API模塊配置-->
<add key="DictType" value="http://localhost:27206/api/Framework/DictType"/>
<add key="DictData" value="http://localhost:27206/api/Framework/DictData"/>
<add key="CorpDictData" value="http://localhost:27206/api/Framework/CorpDictData"/>
<add key="City" value="http://localhost:27206/api/Framework/City"/>
<add key="District" value="http://localhost:27206/api/Framework/District"/>
<add key="Province" value="http://localhost:27206/api/Framework/Province"/>
<add key="UserParameter" value="http://localhost:27206/api/Framework/UserParameter"/>
我們在客戶端,只需要對Web API進(jìn)行封裝即可,這個(gè)部分可以使用Database2Sharp代碼生成工具進(jìn)行統(tǒng)一的生成,所有繼承關(guān)系統(tǒng)一處理好,我們所做的就是進(jìn)行新增接口的處理即可。
例如對于字典模塊DictData的處理,它對于Web API的封裝類如下所示。
?
這個(gè)基類,默認(rèn)封裝了對常規(guī)數(shù)據(jù)表業(yè)務(wù)Web API接口方式的增刪改查以及各種復(fù)雜的接口處理。
如果對于一般的Web API(非數(shù)據(jù)表業(yè)務(wù)),那么只需要繼承的基類做調(diào)整即可。
?
這個(gè)NormalApiService基類,默認(rèn)只是封裝了對token和簽名的讀取處理,沒有特殊的業(yè)務(wù)接口,具體特定的接口我們來實(shí)現(xiàn)處理。
對于WebAPI客戶端的調(diào)用,我們主要就是需要構(gòu)建對應(yīng)的URL,然后通過GET傳遞或者POST傳遞一些參數(shù),并讀取HTML結(jié)果,把它解析為對應(yīng)的類型數(shù)據(jù)即可,如下代碼所示。
/// <summary> /// 根據(jù)字典類型名稱獲取對應(yīng)的字典記錄 /// </summary> /// <param name="dictTypeName">字典類型名稱</param> /// <returns></returns> public List<DictDataInfo> FindByDictType(string dictTypeName) {var action = System.Reflection.MethodBase.GetCurrentMethod().Name;string url = GetTokenUrl(action) + string.Format("&dictTypeName={0}", dictTypeName);List<DictDataInfo> result = JsonHelper<List<DictDataInfo>>.ConvertJson(url);return result; }?
通過GetTokenUrl(action) 函數(shù)獲取對應(yīng)的URL地址,由于傳入一個(gè)參數(shù),接口這里沒有發(fā)生數(shù)據(jù)修改,是GET方式提交參數(shù)數(shù)據(jù),因此把參數(shù)附加在URL即可。
也就是下面代碼實(shí)現(xiàn)了完整Web API地址的構(gòu)建。
string url = GetTokenUrl(action) + string.Format("&dictTypeName={0}", dictTypeName);
構(gòu)建好這些URL地址后,我們通過獲取對應(yīng)Web API的結(jié)果并進(jìn)行序列號到具體對象即可。如下代碼所示。
List<DictDataInfo> result = JsonHelper<List<DictDataInfo>>.ConvertJson(url);
關(guān)于Web API接口的設(shè)計(jì)文章,可以參考我的隨筆。
- Web API接口設(shè)計(jì)經(jīng)驗(yàn)總結(jié)
- Web API應(yīng)用架構(gòu)設(shè)計(jì)分析(1)
- Web API應(yīng)用架構(gòu)設(shè)計(jì)分析(2)
具體的Web API接口的使用,可以參考隨筆: - Web API應(yīng)用架構(gòu)在Winform混合框架中的應(yīng)用(1)
- Web API應(yīng)用架構(gòu)在Winform混合框架中的應(yīng)用(2)--自定義異常結(jié)果的處理
- Web API應(yīng)用架構(gòu)在Winform混合框架中的應(yīng)用(3)--Winfrom界面調(diào)用WebAPI的過程分解
- Web API應(yīng)用架構(gòu)在Winform混合框架中的應(yīng)用(4)--利用代碼生成工具快速開發(fā)整套應(yīng)用
- Web API應(yīng)用架構(gòu)在Winform混合框架中的應(yīng)用(5)--系統(tǒng)級別字典和公司級別字典并存的處理方式
通過以上的封裝處理,那么對于業(yè)務(wù)表的Web API接口調(diào)用,具體使用客戶端的代碼如下所示。
var dictType = CallerFactory<IDictTypeService>.Instance.GetTree(); Console.WriteLine(dictType.ToJson());var dictData = CallerFactory<IDictDataService>.Instance.GetAllDict(); Console.WriteLine(dictData.ToJson());?
如果對于非數(shù)據(jù)表業(yè)務(wù)的Web API接口調(diào)用,具體使用客戶端的代碼如下所示。
var testAction = CallerFactory<ITestService>.Instance.TestAction(); Console.WriteLine(testAction.ToJson());var test = CallerFactory<ITestService>.Instance.Test("123"); Console.WriteLine(test.ToJson());?
這樣,不管是在Web項(xiàng)目里面,還是在Winform項(xiàng)目里面,或者在跨平臺(tái)的IOS項(xiàng)目里面(或者安卓項(xiàng)目),都可以以相同的方式消費(fèi)Web API,這樣我們所有的數(shù)據(jù)入口在一個(gè)地方,可以集中業(yè)務(wù)接口的統(tǒng)一開發(fā),并且可以有效管理我們的數(shù)據(jù)提供的性能問題,如統(tǒng)一緩存處理,統(tǒng)一權(quán)限處理...
感謝大家對本文章的細(xì)心閱讀,希望對您的開發(fā)有所啟發(fā)或幫助。
主要研究技術(shù):代碼生成工具、會(huì)員管理系統(tǒng)、客戶關(guān)系管理軟件、病人資料管理軟件、Visio二次開發(fā)、酒店管理系統(tǒng)、倉庫管理系統(tǒng)等共享軟件開發(fā)
專注于Winform開發(fā)框架/混合式開發(fā)框架、Web開發(fā)框架、Bootstrap開發(fā)框架、微信門戶開發(fā)框架的研究及應(yīng)用。
??轉(zhuǎn)載請注明出處:
撰寫人:伍華聰??http://www.iqidi.com?
總結(jié)
以上是生活随笔為你收集整理的【转】Web API项目中使用Area对业务进行分类管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 骁龙8+旗舰ROG游戏手机6入网:电量比
- 下一篇: 【转】ABP源码分析四十六:ABP ZE