Microsoft Patterns & Practices團隊在2007年發(fā)布的Enterprise Library 3.0 February 2007 CTP中,我們驚喜地發(fā)現了AOP的蹤跡,其名為Policy Injection Application Block(PIAB)。Enterprise Library的產(chǎn)品經(jīng)理Tom Hollander和架構師Edward Jezierski都相繼在自己的博客上介紹了PIAB。從特征與功能來(lái)看,已經(jīng)基本具備了AOP的要求。
從技術(shù)實(shí)現來(lái)看,PIAB并沒(méi)有特別的創(chuàng )新,沿用了大多數致力于.NET平臺AOP研究人員的思路,采用了Remoting Proxy技術(shù)。PIAB定義了特殊的工廠(chǎng)類(lèi),通過(guò)它添加Policy,然后創(chuàng )建代理對象實(shí)例。受到Remoting Proxy技術(shù)的限制,所謂的代理對象必須繼承自MashalByRefObject。例如:
public class LoggingTarget : MarshalByRefObject
{
public string DoSomething(int one, string two, double three)
{
return string.Format("{1}: {0} {2}", one, two, three);
}
}
添加Policy與創(chuàng )建Aspect對象的方法如下:
private PolicySet GetLoggingPolicies()
{
PolicySet policies = new PolicySet();
Policy simpleInputsPolicy = new Policy("simpleInputsPolicy");
simpleInputsPolicy.RuleSet.Add(new MatchByNameRule("MethodWithSimpleInputs"));
simpleInputsPolicy.Handlers.Add(new SignatureCheckingHandler(new Type[] { typeof(int), typeof(string) }));
policies.Add(simpleInputsPolicy);
return policies;
}
private LoggingTarget CreateTarget()
{
InterceptionFactory factory = new InterceptionFactory();
factory.AddPolicies(GetLoggingPolicies());
return factory.CreateNew<LoggingTarget>();
}
代理對象(Proxy Object)會(huì )通過(guò)Handler鏈定位到真實(shí)對象(Real Object),而Policy則被注入到代理對象和真實(shí)對象中。整個(gè)流程如圖:

在Policy中,包含了一個(gè)Matching Rules集合以及Handlers Pipeline。從AOP技術(shù)的角度來(lái)看,代理對象所指代的真實(shí)對象就是“Aspect”,而Policy則是切入點(diǎn),它可以通過(guò)Matching Rules來(lái)定位代理對象的方法,至于Handler則近似于A(yíng)dvise。
Authorization橫切關(guān)注點(diǎn)(Cross-Cutting Concerns)的處理方式如圖所示:

PIAB目前預定義的Handler包括Validation Handler、Logging Handler、Exception Handling Handler、Authorization Handler、Caching Handler。這些Handler與Enterprise Library中的其他Application Block幾乎是一一對應的。事實(shí)上,權限認證、日志、異常處理、緩存等,恰恰都是AOP技術(shù)最重要的關(guān)注點(diǎn)。在February 2007 CTP版本之前的Application Block,實(shí)際上已經(jīng)具備了AOP的雛形。然后,由于它在“橫切”與“注入”方面的缺乏,始終無(wú)法達到AOP所要求的重用目的。Policy Injection Application Block正好彌補了這樣的缺憾。
本人也曾利用Remoting Proxy技術(shù)開(kāi)發(fā)了.NET平臺下的AOP組件,基本實(shí)現了AOP的主要功能。然后因為兩個(gè)困惑,使得這一工作沒(méi)有繼續進(jìn)行下去。
1、使Aspect對象繼承自MarshalByRefObject是否過(guò)于專(zhuān)制?鑒于許多語(yǔ)言都具備單繼承的特性,如果剝奪了一個(gè)類(lèi)繼承的能力,就使得程序的設計者多了很多約束。這是否是明智的選擇呢?
2、繼承自MarshalByRefObject后,效率究竟如何?我曾經(jīng)做個(gè)這樣的測試,發(fā)現繼承自MarshalByRefObject類(lèi)的對象比沒(méi)有繼承MarshalByRefObject類(lèi)的對象,在性能上相差了幾十倍。PIAB采用Remoting Proxy技術(shù),是否在性能上有所考慮呢?
posted on 2007-03-20 17:58 Bruce Zhang 閱讀(1404) 評論(4) 編輯 收藏 引用 網(wǎng)摘 所屬分類(lèi): AOP
透明代理,這個(gè)2003年就有人實(shí)現了吧 回復 更多評論
必須繼承MarshalByRefObject基類(lèi),嚴重制約了它的可使用性,
估計這種方式能接受的人很少了
回復 更多評論
all:
這是我粗略看過(guò)PIAB后得出的結果。我也對這樣的實(shí)現方式感到奇怪,但不知是否在理解上有所偏差?之所以post這個(gè)帖子,也是希望更多的AOP的研究者能夠看看PIAB的功能與SourceCode。 回復 更多評論
聯(lián)系客服