在 SP(服務提供商)無線運營系統中,上下游接口協議不一、業務邏輯差異大,導致同步接口難以抽象復用。本文通過一個實際項目案例,展示如何利用 IoC(控制反轉)容器與 AOP(面向切面編程) 構建靈活、可擴展的接口處理架構。
無線運營核心流程涉及用戶上行(MO)、下行(MT)、計費、狀態報告等環節。根據業務差異,可能存在預提交、MO 同步、MT 狀態報告等不同步驟組合。首先抽象三大核心數據對象:
ApiRequest:預提交原始信息(號碼、下游 ID、附加參數)。ApiSync:MO 同步原始信息(號碼、上行內容、LinkID)。ApiStateReport:狀態報告原始信息(號碼、LinkID、狀態參數)。對應定義三個處理器接口:IApiRequestHandler、IApiSyncHandler、IApiStateReportHandler,各自擁有對應的 Invoker 依賴,遵循「組合優於繼承」原則。
利用 ASP.NET IHttpHandler 處理無界面的接口請求。為避免為每個接口編寫 .aspx 頁面,採用 IHttpHandlerFactory 根據請求參數 type 動態解析 Handler:
public class ApiHandlerFactory : IHttpHandlerFactory
{
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
string type = context.Request["type"]; // request / sync / state
IApplicationContext appContext = ContextRegistry.GetContext(); // Spring.NET
return appContext[type] as IHttpHandler;
}
public void ReleaseHandler(IHttpHandler handler) { }
}
在 XML 中聲明對象圖,實現依賴注入:
<object id="DefaultRequestInvoker" type="Service.ApiService.DefaultRequestInvoker, Service" />
<object id="request" type="Api.DefaultRequestHandler, Api">
<property name="RequestInvoker" ref="DefaultRequestInvoker" />
</object>
<object id="sync" type="Api.DefaultSyncHandler, Api">
<property name="SyncInvoker" ref="DefaultSyncInvoker" />
</object>
<!-- 更多業務變體,如 filmSync -->
web.config 僅註冊統一入口:
<httpHandlers>
<add verb="GET,POST" path="entry.aspx" type="Api.ApiHandlerFactory, Api" />
</httpHandlers>
配合 URL Rewrite,對外暴露 REST 風格接口:/api/request、/api/100/sync,新增接口僅需配置,無需寫代碼。
當遇到極其特殊(BT)的上游接口,現有擴展點無法覆蓋時,AOP 成為「金剛鑽」。以某特殊 SPID=103 的 MO 同步為例:
public class BT_SyncInterceptor : IMethodInterceptor
{
public object Invoke(IMethodInvocation invocation)
{
HttpContext ctx = invocation.Arguments[0] as HttpContext;
if (ctx != null && ctx.Request["spid"] == "103")
{
// 處理特殊業務邏輯
}
return invocation.Proceed(); // 繼續原有流程
}
}
修改 Spring 配置,為 sync 代理添加攔截器:
<object id="sync" type="Spring.Aop.Framework.ProxyFactoryObject">
<property name="Target">
<object type="Api.DefaultSyncHandler, Api">
<property name="SyncInvoker" ref="DefaultSyncInvoker" />
</object>
</property>
<property name="InterceptorNames">
<list><value>BT_SyncInterceptor</value></list>
</property>
</object>
通過第三方程序集部署攔截器,實現「核心邏輯不動、特殊邏輯插件化」,完美詮釋「你有張良計,我有 AOP」。
本架構通過 IoC 實現依賴解耦與配置驅動,配合 AOP 處理橫切關注點,極大降低了接口接入成本。後續可探索異步處理模式(如老趙 InfoQ 專欄所述)進一步提升 IO 密集型場景吞吐量。