unity是一款知名的依賴注入容器,其支援通過自定義擴充套件來擴充功能。在unity軟體包內預設包含了乙個物件攔截(interception)擴充套件定義。本篇文章將介紹如何使用物件攔截功能來幫助你分離橫切關注點(separation of cross-cutting concerns)。
物件攔截是一種aop(aspect-oriented programming)程式設計的實踐方法。其可幫助你保持業務類的純淨,而無需考慮諸如日誌和快取等外圍關注點。
在.net中,實現aop有多種方法。一種方式是採用編譯後處理方式,例如postsharp。在編譯後,postsharp通過修改il**來諸如橫切**。
相反地,物件攔截是在執行時執行的,同時也意味著會有一些限制。依據不同的***實現,會有如下這些約束:
當從unity容器請求目標物件時,將不會獲取到已配置的類的例項。實際上,將得到乙個動態生成的**物件,或者乙個衍生類。
如果呼叫**物件的乙個方法,將可以在被呼叫方法執行前或執行後執行一些額外行為的**。那些定義行為的類需要實現icallhandler介面。通過這些行為定義,我們可以訪問方法呼叫的引數列表,可以吞噬異常,或者可以返回自定義的異常。
附帶提一下,在不使用unity容器的條件下,也是可以使用unity***的。
在下面的示例中,我們將建立兩個自定義的行為,都實現了icallhandler介面:
exceptionloggercallhandler定義如下:
1為了將行為應用到方法上,我們需要建立相應的handlerattribute來建立行為的例項。internal
class
exceptionloggercallhandler : icallhandler
2 ->
", i, parameter.tostring()));16}
17console.writeline();
18 console.writeline("
exception occured: ");
19console.writeline(
20string.format("
\texception ->
", result.exception.message));
2122
console.writeline();
23 console.writeline("
stacktrace:");
24console.writeline(environment.stacktrace);25}
2627
return
result;28}
2930
public
int order
31 }
1在這個示例中,我們建立乙個簡單的計算器類。同時為了使用介面攔截功能,我們還需建立乙個介面型別,這樣才能應用指定的行為:internal
class
exceptionloggerattribute : handlerattribute
27 }
1計算器類的實現還和常規的一樣。現在我們需要配置unity容器:public
inte***ce
icalculator
2
unity並不提供乙個完整的aop框架,因此使用它會有一些限制。但不管怎樣,使用unity物件攔截功能來實現一些基本的aop需求已經足夠了。
文章譯自
使用spring的aop進行許可權攔截
乙個ssi的專案 springmvc mybatis 需要加上許可權驗證 非資料許可權 考慮使用aop來實現。大致思路是使用自定義註解,在需要許可權控制的方法前 controller層 使用註解定義方法所需的許可權,然後使用aop攔截訪問的方法,在執行目標物件前通過反射取得目標物件所需的許可權,然後...
Unity使用JsonFx進行JSON 反 序列
unity作為客戶端要與服務端通訊,最為簡單通訊協議就是使用json格式。本文簡單講述unity使用jsonfx進行json 反 序列。容器其實是你想通過json字串解析出來的類,他包含了若干個字段資料,例如sandwich類 using system.collections using syste...
使用物件進行分頁顯示
header content type text html charset utf 8 class localhost function getmysqlbefore else else else function count function allover sql1 class page fun...