上篇我們簡單的瞭解了{
tagshow(event)
}">AOP的應用情境,知道AOP編程的重要性。這篇我們先看一段代碼,來開始今天的學習。
回顧與上篇類似的代碼:SecurityService類的IsPass判斷使用者名稱為“admin”則有許可權儲存資料。OrderService為儲存資料的類,實現IOrderService{
tagshow(event)
}">介面。
- public class SecurityService
- {
- public bool IsPass(string userName)
- {
- return userName == "admin";
- }
- }
- public interface IOrderService
- {
- string UserName { get; set; }
- object Save(object id);
- }
複製代碼
實現部分
OrderService
- public class OrderService : IOrderService
- {
- public string UserName { get; set; }
- public object Save(object id)
- {
- return "儲存:" + id.ToString();
- }
- }
複製代碼
AroundAdvise
- public class AroundAdvise : IMethodInterceptor
- {
- public object Invoke(IMethodInvocation invocation)
- {
- IOrderService target = (IOrderService)invocation.Target;
- SecurityService manager = new SecurityService();
- if (manager.IsPass(target.UserName))
- {
- return invocation.Proceed();
- }
- else
- {
- return null;
- }
- }
- }
複製代碼
用戶端部分:
Program
- class Program
- {
- static void Main(string[] args)
- {
- ProxyFactory factory = new ProxyFactory(new OrderService() { UserName = "admin" });
- factory.AddAdvice(new AroundAdvise());
- IOrderService service = (IOrderService)factory.GetProxy();
- object result = service.Save(1);
- Console.WriteLine(result);
-
- Console.ReadLine();
- }
- }
複製代碼
輸出: 儲存:1
通過上篇的學習,我們知道,什麼是AOP——面向切面的編程。在AOP(面向切面的編程)中,我們編寫程式時,首先思考要對程式中哪些方法進行攔截,攔截到這些方法後又要做哪些業務處理。這些關注過程,我們稱之為:橫切性關注點。由“橫切性關注點”引申出以下概念:
Aspect(切面):指橫切性關注點的抽象即為切面,它與類相似,只是兩者的關注點不一樣,類是對物體特徵的抽象,而切面是橫切性關注點的抽象。程式裡的切面就是AroundAdvise類的實現部分。
joinpoint(連接點):所謂連接點是指那些被攔截到的點。在Spring.NET中,連接點指的是方法,因為Spring.NET只支援方法類型的連接點,實際上joinpoint(連接點)還可以是欄位或類構造器。程式裡的連接點就是攔截到的方法,如OrderService類的Save方法。
Pointcut(切入點):所謂切入點是指我們要對那些joinpoint(連接點)進行攔截的定義。程式裡沒有使用invocation.Method來判斷攔截哪些方式,而Pointcut(切入點)就是對所有方法進行攔截。
Advice(通知):所謂通知是指攔截到joinpoint(連接點)之後所要做的事情就是通知.通知分為前置通知,後置通知,異常通知,環繞通知。AroundAdvise繼承AopAlliance.Intercept.IMethodInterceptor 介面,程式裡使用的是環繞通知。
Target(目標對象):代理的目標對象。程式裡的目標對象就是OrderService類,我們通過
- ProxyFactory factory = new ProxyFactory(new OrderService() { UserName = "admin" });
複製代碼
這句代碼確定了目標對象是OrderService。
AOP代理(AOP proxy):由AOP{
tagshow(event)
}">架構在將通知應用於目標對象後建立的對象。程式裡通過GetProxy()方法建立出的代理對象。
Weave(織入):指將切面(aspect)應用到目標對象(target)對象並導致代理(proxy)對象建立的過程稱為織入。正如程式裡所應用的,OrderService類不具備判斷許可權的功能,我們將判斷許可權的功能——SecurityService類的IsPass方法應用到目標對象的過程。
Introduction(引入):在不修改類代碼的前提下,Introduction(引入):可以在運行期為類動態地添加一些方法或欄位。程式裡在沒有修改OrderService類,而是在運行期把判斷許可權的功能通過ProxyFactory的AddAdvice方法動態增加進去。
這些術語不屬於Spring.NET,而屬於整個AOP編程。所謂AOP,我的理解就是應該是這樣一個過程,首先需要定義一個切面,這個切面是一個類,裡面的方法就是關注點(也是通知),或者說裡面的方法就是用來在執行目標對象方法時需要執行的前置通知,後置通知,異常通知,最終通知,環繞通知等等。有了切面和通知,要應用到目標對象,就需要定義這些通知的切入點,換句話說就是需要對哪些方法進行攔截,而這些被攔截的方法就是連接點,所謂連接點也就是在動態執行過程,被織入切面的方法(至少在Spring.NET中只能對方法進行攔截)。因此,在動態過程中通知的執行就屬於織入過程,而被織入這些通知的對象就是目標對象了