2010-09-02 67 views
2

我是Unity 2.0 AOP功能的首次使用者,希望得到一些建議。我的目標是能在一個ASPX頁面登錄方法調用,像這樣:Intercept Unity 2.0 HandlerAttribute無界面

public partial class Page2 : Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
     } 

     [Log] 
     private void Testing() 
     { 

     } 
    } 

下面是LogAttribute代碼:

public class LogAttribute : HandlerAttribute 
{ 
    public override ICallHandler CreateHandler(IUnityContainer container) 
    { 
     return new LogHandler(Order); 
    } 
} 

現在LogHandler

public class LogHandler : ICallHandler 
{ 
    public LogHandler(int order) 
    { 
     Order = order; 
    } 

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
    { 
     string className = input.MethodBase.DeclaringType.Name; 
     string methodName = input.MethodBase.Name; 

     string preMethodMessage = string.Format("{0}.{1}", className, methodName); 
     System.Diagnostics.Debug.WriteLine(preMethodMessage); 

     return getNext()(input, getNext); 
    } 

    public int Order { get; set; } 
} 

我遇到的問題是如何使用[Log]屬性。我見過很多例子中如何配置攔截設置,例如:

container.AddNewExtension<Interception>(); 
container.Configure<Interception>().SetDefaultInterceptorFor<ILogger>(new InterfaceInterceptor()); 

但這意味着我有一個接口進行攔截,這我不知道。我有使用[Log]屬性的ASPX頁面。

那麼我該如何配置Unity以利用[Log]屬性?在使用PostSharp之前,我已經完成了這項工作,並希望能夠使用Unity來完成相同的工作。

乾杯。 Jas。

回答

6

很遺憾,你不會在一個帶有Unity攔截的ASP.NET頁面中工作。

統一攔截使用運行時攔截模型。根據您選擇的攔截器,您可以使用虛方法覆蓋來獲取子類,以調用執行調用處理程序然後轉發到實際對象的調用處理程序(VirtualMethodInterceptor)或單獨的代理對象(Interface或TransparentProxyInterceptor)。

下面是問題 - ASP.NET控制創建和調用您的頁面,並沒有簡單的方法來鉤住它們。如果不控制頁面對象的創建,則不能使用VirtualMethodInterceptor,因爲這需要您實例化一個子類。而且你也不能使用代理版本,因爲你需要ASP.NET通過代理進行調用。

PostSharp解決了這個問題,因爲它實際上是在編譯時重寫你的IL。

假設你可以掛鉤創建頁面對象,你必須在這裏使用VirtualMethodInterceptor。這是一個私有方法,因此您需要登錄「自我」調用(將對象的一種方法調用到同一對象上的另一種方法中)。基於代理的攔截器無法看到這些,因爲代理是一個單獨的實例。

我希望有個地方可以定製ASP.NET如何創建對象 - BuildManager也許?但我對細節知之甚少,而且我預計這需要一些非常嚴重的黑客才能獲得工作。

那麼,你如何解決這個問題?我的建議(實際上,我推薦這麼做)是爲你的ASP.NET頁面使用Model-View-Presenter模式。使頁面對象本身啞。它所做的只是將呼叫轉發給單獨的對象Presenter。 Presenter是您的真實邏輯所在,並且獨立於ASP.NET的詳細信息。您在可測試性方面獲得了巨大的收益,並且您可以在沒有ASP.NET提供給您的所有困難的情況下攔截演示者的調用。