使用Unity進行AOP物件攔截

2021-09-22 11:16:22 字數 2320 閱讀 4451

unity是一款知名的依賴注入容器,其支援通過自定義擴充套件來擴充功能。在unity軟體包內預設包含了乙個物件攔截(interception)擴充套件定義。本篇文章將介紹如何使用物件攔截功能來幫助你分離橫切關注點(separation of cross-cutting concerns)。

物件攔截是一種aop(aspect-oriented programming)程式設計的實踐方法。其可幫助你保持業務類的純淨,而無需考慮諸如日誌和快取等外圍關注點。

在.net中,實現aop有多種方法。一種方式是採用編譯後處理方式,例如postsharp。在編譯後,postsharp通過修改il**來諸如橫切**。

相反地,物件攔截是在執行時執行的,同時也意味著會有一些限制。依據不同的***實現,會有如下這些約束:

當從unity容器請求目標物件時,將不會獲取到已配置的類的例項。實際上,將得到乙個動態生成的**物件,或者乙個衍生類。

如果呼叫**物件的乙個方法,將可以在被呼叫方法執行前或執行後執行一些額外行為的**。那些定義行為的類需要實現icallhandler介面。通過這些行為定義,我們可以訪問方法呼叫的引數列表,可以吞噬異常,或者可以返回自定義的異常。

附帶提一下,在不使用unity容器的條件下,也是可以使用unity***的。

在下面的示例中,我們將建立兩個自定義的行為,都實現了icallhandler介面:

exceptionloggercallhandler定義如下:

1

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 }

為了將行為應用到方法上,我們需要建立相應的handlerattribute來建立行為的例項。

1

internal

class

exceptionloggerattribute : handlerattribute

27 }

在這個示例中,我們建立乙個簡單的計算器類。同時為了使用介面攔截功能,我們還需建立乙個介面型別,這樣才能應用指定的行為:

1

public

inte***ce

icalculator

2

計算器類的實現還和常規的一樣。現在我們需要配置unity容器:

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...