ABP框架详解(八)动态ApiController的生成和访问机制
在ABP框架中提供了一套動態(tài)生成ApiController的機(jī)制(依然支持原生ApiController的使用方式),雖然說是動態(tài)生成ApiController但是實際上并沒有真正在啟動程序的時候生成任何ApiController類的子類,客戶端所有對動態(tài)控制器的訪問都集中到同一個泛型類DynamicApiController<T>上。真正用來區(qū)別不同服務(wù)的是其泛型T,這是一個繼承自IApplicationService的接口,用戶自定義的應(yīng)用服務(wù)類繼承T接口并實現(xiàn)其中的方法。系統(tǒng)在啟動階段會自動注冊所有應(yīng)用服務(wù)類。
實際上動態(tài)控制器之所以能工作就是依賴IApplicationService在程序開始階段已經(jīng)被注冊到容器中。ABP框架中存在一個攔截器AbpDynamicApiControllerInterceptor<T>,在DynamicApiController<T>控制器類型上添加接口代理(IApplicationService的子類)也就是說對該控制器類型的任何應(yīng)用服務(wù)方法的訪問都會被攔截,利用攔截器的構(gòu)造函數(shù)public AbpDynamicApiControllerInterceptor(T proxiedObject),將應(yīng)用服務(wù)的真實類型解析進(jìn)去,然后通過反射執(zhí)行應(yīng)用服務(wù)中的方法。比較漂亮的一點(diǎn)就是自定義的AbpApiControllerActionSelector和DynamicHttpActionDescriptor類,在Selector的SelectAction方法中會新建一個DynamicHttpActionDescriptor實例,并將IApplicationService子接口的方法MethodInfo傳遞進(jìn)去,這樣就可以利用WebApi原生的參數(shù)綁定機(jī)制完成參數(shù)的獲取了。
在程序的開始階段調(diào)用DynamicApiControllerBuilder的泛型方法ForAll<T>(Assembly assembly, string servicePrefix)找到assembly中所有T的自定義子接口,根據(jù)子接口及其中定義的方法包裝成DynamicApiControllerInfo和DynamicApiMethodInfo存儲到DynamicApiControllerManager靜態(tài)類中字典字段中,以后需要獲取任意一個控制器的信息也是通過該靜態(tài)類根據(jù)Servic的名字來獲得的。
訪問的話就沒有多少好說的了,在DynamicApiControllerBuilder收集所有應(yīng)用服務(wù)信息來生成DynamicApiControllerInfo的時候可以指定Prefix,以后所有希望調(diào)用IApplicationService的Request都需要有該前綴,至于服務(wù)的名稱默認(rèn)是IApplicationService的子接口名(像“ApplicationService”,”AppService“等等幾個后綴還是需要去掉的,最前面“I”也是要刪掉的),當(dāng)然后可以定義一個委托Func<Type, string> _serviceNameSelector,來自定義服務(wù)名,再就是在服務(wù)名的后面添加方法名來唯一定位到應(yīng)用服務(wù)的Action。別忘了定義Route,系統(tǒng)默認(rèn)定義了一個services為前綴的動態(tài)控制器的RouteTemplate。
轉(zhuǎn)載于:https://www.cnblogs.com/Azula/p/5320547.html
總結(jié)
以上是生活随笔為你收集整理的ABP框架详解(八)动态ApiController的生成和访问机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 即时获取最新全国省市区县地图json数据
- 下一篇: p系列服务器产品介绍,常用p系列服务器R