2010-08-02 105 views
1

是否有攔截方法調用的一個類,所以你可以做AOP?如何攔截一個類的方法調用

例如

我想Teacher.Talk()在兩種情況下執行不同:

class School 
{ 
    [Fun] 
    public void Picnic { 
     Teacher t = new Teacher(); 
     t.Talk(); 
    } 

    public void Seminar{ 
     Teacher t = new Teacher(); 
     t.Talk(); 
    } 
} 

在上面的代碼中,函數野餐由玩轉屬性的裝飾,所以老師的通話功能要比更有趣研討會功能中未由屬性修飾的功能。

我檢查了Castle.DynamicProxy,但它使用代理類並需要一些代碼修改。這無助於解決我的問題,因爲我想使用該屬性來執行配置,因此當決策發生變化時,只需要很少的代碼修改。

非常感謝!

回答

1

有兩種基本方法:創建一個子類代理或將代碼重新編譯成「編譯時編織」,以便將鉤子輸入到已編譯的程序集中。

子類化只允許您攔截虛擬方法和構造函數,而編譯時織入可以在任意位置輸入鉤子以攔截代碼庫中的調用。

+0

謝謝,但子類提供了一個解決我的問題。我需要在函數的作用域中配置對象行爲,而不是時間範圍。 – Roy 2010-08-04 05:59:12

+0

它只提供部分解決方案。您必須: 1)使用TeacherFactory隱藏您可能正在發回代理的事實。 2)在代理中,你將不得不運行調用堆棧並檢查堆棧中的方法,以查找您感興趣的屬性FunAttribute 3)祈禱您的Teacher.Talk方法在一次調用中不會被調用100萬次內循環某處。 ;-) – SargeATM 2010-08-05 02:17:53

1

幾個月前研究過同樣的問題後,我發現唯一合適的解決方案就是使用PostSharp。 http://www.sharpcrafters.com/

即使這樣也不理想,因爲它禁用了使用屬性(give或take)的類中的Edit/Continue。

+0

[CodeCop](http://getcodecop.com/)是一個建立在JSON之上的庫,爲您的.NET應用程序編寫方法攔截器提供了一種快速而不顯眼的方式。 [Here](https://bitbucket.org/codecop_team/codecop/wiki/Home)是一個wiki。 你可以試試:) – 2015-09-03 14:33:31