.NET :消息與AOP(一)
2024-07-10 13:05:10
供稿:網友
方法調用與消息
如果一個目標對象委托給一個真實代理實例,那么所有對對應的透明代理的方法調用都會經過一個消息轉換與反轉換的過程,而
正是將方法調用轉換為消息后,我們才有機會實現預(后)處理,這樣更進一步的結果是 ==》 實現所謂的aop。
1. 真實代理:從realproxy派生,最主要的是復寫invoke方法。invoke方法的主要職能是為截獲方法調用加上預(后)處理,以
此來實現aop。
(1) 一種真實代理類型就表示一種特定的預(后)處理,如果一個類希望自己的公共方法被外界調用時進行適當的預處理或后處理,
那么該類可以將自己的實例委托給有此預(后)處理功能的真實代理。
(2) 真實代理實例與透明代理實例是一一對應的。不存在透明代理的類,但是卻可以從真實代理實例得到透明代理。
(3) 透明代理:將方法調用轉換為消息(實際被轉換的是堆棧幀)。針對透明代理調用目標對象的方法,會被最終轉發到目標對象
上。在使用層面上來看,可以將透明代理當作目標對象本身。
(4) stack builder sink :將消息轉換為方法調用,并返回調用結果給代理,再由代理將結果轉為響應消息通過rpc傳遞,然后
在將響應消息轉換為調用后的堆棧,這樣原調用方便可得到調用結果。
(5) 針對不同的預(后)處理,可以定義不同的真實代理類型。
2. 如果一個類(比如class example)希望外界調用它的公共方法(包括ctor)時,通過代理來完成(主要目的是實現某種特定
的預/后處理),那么有兩種方法來實現:
(1) 將example以工廠方法的模式實現,這樣在其static instance方法中,可以將一個新實例的引用委托給一個實現特定預處理和
后處理的真實代理。接著將該代理的透明代理強制轉換為該類引用,并返回它。此處情況下,真實代理類型僅需從realproxy一
個類派生。
(2) 通過代理特性(一種特殊的真實代理)實現。
首先,代理特性類型必須從proxyattribute派生,此時有兩個方法需要復寫,一個是invoke方法,另一個是createinstance方法。
u example必須contextboundobject派生,即example必須為一個上下文綁定對象,另外,為example類加上代理特性。
注意,對不是從contextboundobject類派生的類實施上下文特性(即代理特性)。
u 在該情況下,對象激活(即new example時)被分為兩個階段,首先調用真實代理的createinstance方法,生成一個未初始化的對象;
接著在將ctor轉發給真實代理的invoke方法。
注意:(1)和(2)的比較:(1)中將目標對象委托給代理是example自己的職責,而(2)中把該職責轉移到代理中去了。
1. 上下文特性修飾一個類,以后每次new這個類產生對象時,都將對象放入相應的上下文中。
2. 上下文特性與上下文屬性通常是一一對應的。
3. 上下文特性在創建時將上下文屬性添加到上下文中,更確切說,是這樣的,上下文特性檢查當前上下文中
是否存在要添加的屬性,并且存在的屬性值與要添加的屬性值是否相等,如果兩者都滿足,則直接在該上
下文中創建新實例。否則,上下文特性將要求對象ctor創建一個新的上下文包含所要添加的屬性。
4. 一個上下文可以包含多個不同的上下文屬性,每一組確定的上下文屬性值即可確定一個上下文。
5. 消息接收器本身可以作為任何種類的接收器,關鍵是看上下文屬性將其安排為何種接
收器(如,信使接收器,服務器上下文接收器)
上下文屬性向消息接收器鏈中插入消息接收器的兩種方式:
(1)僅僅發布公共屬性 p240
(2) 實現某些類型的接收器接口(如信使接收器),然后將某個(些)消息接收器對象確認為對應的接收器接口類型。p349
注意:上下文(context)是存在于當前應用域中的,用于將該上下文中的屬性轉換為接收器插入到該上下文中的對象的方法調用過程中。
而調用上下文(call context)是存在于消息接收器鏈中的,用于在鏈中傳遞信息。